Android 는 SurfaceView 를 이용 하여 간단 한 타 이 머 를 실현 합 니 다.
4452 단어 AndroidSurfaceView타이머
그러나 한 사람 이 쓴 성취 감 이 부족 하고 어떤 문제 와 해답 방법 을 던 지면 더 좋 은 피드백 과 해결 방안 을 얻 을 수 있다 는 느낌 이 든다.그래서 죽지 않 는 다 는 마음으로 한 걸음 한 걸음 기술 이 성장 하 는 길 을 걷 고 있 습 니 다.>이 블 로그 가 그 중의 한 걸음 입 니 다!
블 로그 에 기술 지식 이 잘못 되 거나 더 최 적 화 된 해답 방안 이 있다 면 동료 들 이 많이 지적 해 주시 기 바 랍 니 다.
다음은 본론 이다.
목표: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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.