Android View.ondraw ()는 항상 깨끗한 캔버스를 가지고 있습니다
-
19-09-2019 - |
문제
나는 애니메이션을 그리려고 노력하고 있습니다. 그렇게하기 위해 ondraw () 메소드를 확장하고 재정의했습니다. 내가 기대할 것은 ondraw ()가 캔버스라고 불리는 시간마다 내가 그것을 떠난 상태에있을 것이며 그것을 지우거나 그 일부를 그릴 수 있도록 선택할 수 있다는 것입니다. ) 그러나 캔버스가 다시 돌아올 때마다 이미 지워졌습니다. 내가 그것을 지울 수없는 방법이 있습니까? 아니면 이전 상태를 비트 맵에 저장하여 비트 맵을 그려서 그 위에 그 위로 끌 수 있습니까?
해결책
방법이 있는지 확실하지 않습니다. 그러나 내 사용자 정의보기의 경우 ondraw ()가 호출 될 때마다 모든 것을 다시 그리거나 비트 맵으로 그리고 캔버스에 비트 맵을 그립니다 (질문에서 제안한 것처럼).
내가하는 방법은 다음과 같습니다
class A extends View {
private Canvas canvas;
private Bitmap bitmap;
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (bitmap != null) {
bitmap .recycle();
}
canvas= new Canvas();
bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
}
public void destroy() {
if (bitmap != null) {
bitmap.recycle();
}
}
public void onDraw(Canvas c) {
//draw onto the canvas if needed (maybe only the parts of animation that changed)
canvas.drawRect(0,0,10,10,paint);
//draw the bitmap to the real canvas c
c.drawBitmap(bitmap,
new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()),
new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null);
}
}
다른 팁
당신은 살펴 봐야합니다 여기 기본보기와 SurfaceView의 차이점을 확인합니다. SurfaceView에는 드로잉 전용 레이어가있어 이전에 그린 것을 추적한다고 생각합니다. 이제 기본보기에서 정말로하고 싶다면 예보와 같은 각 항목을 배열에 넣을 수 있습니다. MapView의 항목 별 오버레이. 거의 같은 방식으로 작동해야합니다
당신의 기대는 현실과 관련이 없습니다 :) 캔버스는 당신이 떠난 방식이 아니지만 대신 비워집니다. 그릴 객체의 배열 목록 (canvas.drawcircle (), canvas.drawbitmap () 등을 만들 수 있습니다. 그래픽 프로그래밍을 처음 접했지만 이것을 소규모로 사용했습니다. 아마도 훨씬 더 좋은 방법이있을 것입니다.