2013-06-17 2 views
1

나는 그리드에 몇 개의 이미지를 가지고있다. [http://cdn.thenextweb.com/wp-content/blogs.dir/1/files/2013/06/jolla4.jpg][1]안드로이드 SurfaceView (캔버스) 다시 그리기를 제어하는 ​​방법

대신 안드로이드의 GridView를 사용하여 : 는 다음과 같이 보이는 아이콘을 애니메이션화해야하기 때문에 저는 캔버스를 사용했습니다. 캔버스를 게임에 사용해야한다고 읽었습니다.

SurfaceView (스레드와 함께)를 사용하여 화면에 이미지를 그립니다.

class MySurface extends SurfaceView implements SurfaceHolder.Callback { 
@Override 
    public void onDraw(Canvas canvas) { 
     //here i create the bitmaps and draw the icons on the screen. 

} 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    thread.setRunning(true); 
    thread.start(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    boolean retry = true; 
    thread.setRunning(false); 
    while (retry) { 
     try { 
      thread.join(); 
      retry = false; 
     } catch (InterruptedException e) {} 
     } 
    } 

이 모두 정상적으로 작동합니다. Mysurface은 코드 내 주요 활동 내에서 호출됩니다

setContentView(new MySurface()); 

문제는 무작위로 다시 그려 된 서피스 뷰 SurfaceView의 캔버스입니다. 캔버스가 다시 그려지는 시간과 횟수를 결정할 수 있도록 해두 고 싶습니다. 주 활동 내에서 onDraw 기능을 호출하는 방법은 무엇입니까? 어떻게해야할지 모르겠다. 내가 스레드 알고

mySurface.onDraw (C)로 수행된다

답변

2

각 화면 새로 고침과 함께 onDraw가 호출됩니다. 화면 재생 빈도는 기기에 따라 다릅니다. 새로 고침 빈도가 70이면 onDraw가 초당 70 회 호출됩니다. onDraw는 별도의 스레드에서 실행되므로 UI ​​스레드에서 호출하여이를 사용하지 않는 것이 좋습니다. onDraw가 마지막으로 호출 된 이후 경과 된 시간 인 델타 시간을 계산합니다. 그리고 비트 맵을 초당 50 픽셀의 애니메이션을 적용한 다음 x + = deltaTime * 50이라고 말한 다음,

이렇게하면 비트 맵이 초당 x 축에서 50 픽셀 만 이동합니다.

x + = 1;

비트 맵을 사용하면 초당 화면 새로 고침 빈도가 이동합니다. 모든 장치마다 새로 고침 빈도가 다르기 때문에 모든 장치에서 동일한 속도로 화면을 업데이트하려면 델타 시간을 사용해야합니다. 그렇지 않으면 애니메이션 속도가 장치마다 다를 수 있습니다.

+0

invalidate()도 있습니다. 뷰를 다시 그리는 메소드입니다. "이것은 UI 스레드에서 호출해야합니다." – user2322791

+0

onDraw에서 다시 호출해야한다고 알리기 위해 onDraw에서 invalidate가 호출됩니다. SurfaceView가 생성 한 스레드에 의해 호출됩니다. – neo

관련 문제