Android 는 SurfaceView 를 이용 하여 간단 한 타 이 머 를 실현 합 니 다.

안 드 로 이 드 를 독학 한 지 몇 달 이 되 었 습 니 다.인터넷 의 리듬 에 따라 블 로 그 를 좀 일찍 써 서 자신의 수준 을 향상 시 켜 야 합 니 다.그러나 기술 수준 에 대한 자신 감 이 부족 하기 때문에 자신의 학습 과정 에서 의 문제 와 중요 한 지식 을 자신의 필기 문서 에 만 적 었 다.
그러나 한 사람 이 쓴 성취 감 이 부족 하고 어떤 문제 와 해답 방법 을 던 지면 더 좋 은 피드백 과 해결 방안 을 얻 을 수 있다 는 느낌 이 든다.그래서 죽지 않 는 다 는 마음으로 한 걸음 한 걸음 기술 이 성장 하 는 길 을 걷 고 있 습 니 다.>이 블 로그 가 그 중의 한 걸음 입 니 다!
블 로그 에 기술 지식 이 잘못 되 거나 더 최 적 화 된 해답 방안 이 있다 면 동료 들 이 많이 지적 해 주시 기 바 랍 니 다.
다음은 본론 이다.
목표:Surface View 를 이용 하여 간단 한 타 이 머 를 실현 합 니 다.
그림:

설명:1.SurfaceView 를 이용 하여 시간 측정 기능 을 실현 하 는 동시에 원 호 를 계속 가득 채 웁 니 다.2.버튼 을 누 르 면 시간 을 멈 출 수 있 습 니 다.
중점:
1.Surface View 에서 Surface Holder.CallBack 의 세 가지 방법 에 대해 복사 하기;
2.surfaceHolder.lockCanvas()를 통 해 새로 열 린 스 레 드 에서 canvas 대상 을 얻어 도형 과 시간 문 자 를 그립 니 다.
3.flag 값 을 설정 하여 스 레 드 run()방법 에서 논리 코드 의 실행 을 제어 합 니 다.
중요 부분 코드:

public TestView(Context context) { 
  super(context); 
  surfaceHolder = getHolder(); 
  surfaceHolder.addCallback(this); 
  countThread = new CountThread(surfaceHolder); 
} 
 
public TestView(Context context, AttributeSet attributeSet) { 
  super(context, attributeSet); 
  surfaceHolder = getHolder(); 
  surfaceHolder.addCallback(this); 
  countThread = new CountThread(surfaceHolder); 
} 

이상 은 사용자 정의 Surface View(TestView)의 구조 함수 로 초기 화 작업 을 합 니 다.(두 번 째 구조 방법 은 실현 과정 에서 복사 되 지 않 아 레이아웃 파일 을 통 해 Activity 에 도입 되 었 을 때 View―>즉,일반 사용자 정의 View 가 반드시 복사 해 야 하 는 구조 방법 을 나타 내지 못 한다.
구조 방법 에서 사용자 정의 내부 스 레 드 클래스 CountThread 를 초기 화하 여 그리 기 작업 을 수행 합 니 다.
다음은 CountThread 클래스 의 run()방법 으로 논 리 를 수행 합 니 다.

@Override 
    public void run() { 
      Canvas canvas = null; 
      int pivotX = getResources().getDisplayMetrics().widthPixels / 2; 
      RectF rectF = new RectF(pivotX - 300, pivotX - 300, pivotX + 300, pivotX + 300); 
      while (!isStop) { 
        try { 
          canvas = surfaceHolder.lockCanvas(); 
          canvas.drawColor(Color.WHITE);//          
//          canvas.drawRoundRect(300, 300, 600, 600, 150, 150, paint);//                ,          21,      android   19 
          canvas.drawArc(rectF, -90, endAngle++, false, paint);//-90      270,            ,   -90 
          canvas.drawText(countTime(endAngle), pivotX, pivotX, paintText);//        
          Thread.sleep(1000); 
        } catch (Exception e) { 
          e.printStackTrace(); 
        } finally { 
          if (canvas != null) {//   canvas       
            surfaceHolder.unlockCanvasAndPost(canvas); 
          } 
        } 
      } 
    } 
주로 Thread.sleep(1000)을 통 해 1 초 간 멈 추고 endAngle 을 통 해 계산한다.
이로써 기본 적 인 프로그램 논 리 는 이미 실현 되 었 다.이 사용자 정의 View 를 Activity 가 지정 한 layot 레이아웃 파일 에 도입 하면 표시 할 수 있 습 니 다.
하지만 그 중 에 도 문제 가 있다.예 를 들 면:
1.그림 의 단 추 를 표시 할 수 없고 사용자 정의 Surface View 보기 만 볼 수 있 습 니 다.
제 방법 은 프레임 레이아웃 으로 설정 하면 됩 니 다.Surface View 는 창의 한 층 에 떠 있 기 때문에 그림 으로 볼 수 있 습 니 다.
2.java.lang.IllegalThreadStateException:Thread already started
이 오 류 는 스 레 드 가 이미 존재 한 다 는 것 을 보 여 준다.이러한 오 류 는 홈 키 나 menu 키 를 누 르 면 자체 적 으로 정 해진 Surface View 가 삭 제 될 수 있 지만 스 레 드 는 삭제 되 지 않 았 습 니 다.사용자 정의 Surface View 를 다시 시작 할 때 다시 시작 합 니 다.해결 방법 은:

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
  if (!countThread.isAlive()) {//       ,     ――>        Thread    ,        ,  “Thread already started ”   
    countThread.start();//SurfaceView        
  } 
} 
surfaceCreated()방법 에서 이 스 레 드 가 생존 중인 지 여 부 를 판단 합 니 다.
물론 이 안에 가장 중요 한 문제 가 하나 더 있다.
홈 키 나 menu 키 를 눌 렀 을 때 프로그램 은 시간 을 재 지 않 았 습 니 다.그러면 이러한 상황 에서 제 해결 방안 은 서 비 스 를 켜 서 프로그램 이 멈 췄 을 때(onStop()시간 을 재 는 수 치 를 받 은 다음 에 service 에 기록 하고 시간 을 재 는 것 입 니 다.응용 프로그램 인터페이스 가 다시 화면 으로 돌아 갈 때(onRestart()데 이 터 를 꺼 내 서 사용자 정의 Surface View 의 논리 run()방법 으로 계속 시간 을 재 는 것 입 니 다.
전체 애플 릿 의 코드 는 다음 링크 를 통 해 다운로드 할 수 있 습 니 다.
클릭 하여 다운로드 페이지 진입:http://xiazai.jb51.net/201701/yuanma/AndroidSurfaceView(jb51.net).rar
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기