나는 애니메이션을 그리려고합니다. 이렇게하려면 onDraw() 메서드를 확장하고 재정의했습니다. 내가 기대할 수있는 것은 onDraw()가 호출 될 때마다 캔버스가 내가 놓은 상태에있을 것이고, 캔버스를 지우거나 그 부분을 그릴 수 있다는 것입니다. (이것은 SurfaceView를 사용했을 때 어떻게 작동했는지입니다.)하지만 캔버스가 다시 돌아올 때마다 이미 해제됩니다. 내가 그것을 지울 수없는 방법이 있습니까? 또는 비트 맵에 이전 상태를 저장하여 비트 맵을 그릴 수 있고 그 위에 그릴 수 있습니다.안드로이드 View.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의 차이점을 보려면 here 모양이 있어야합니다. surfaceView에는 드로잉을위한 전용 레이어가 있습니다.이 레이어는 이전에 그린 그림을 추적합니다. 이제 기본 뷰에서이 작업을 수행하려는 경우 itemized overlay for the mapview과 같이 배열에 그리는 각 항목을 넣을 수 있습니다. 거의 같은 방식으로 작동해야합니다.
기대가 캔버스가되지 않습니다에게/현실 : 승 당신이 그것을 왼쪽 길을 JIB하지 않습니다 어떻게이지만, 대신 빈. 그릴 수있는 객체의 ArrayList (canvas.drawCircle(), canvas.drawBitmap() 등)를 만든 다음 OnDraw()의 ArrayList를 반복합니다. 나는 그래픽 프로그래밍에 익숙하지 않지만 이것을 작은 규모로 사용했다. 어쩌면 훨씬 좋은 방법이있을 것입니다.
캔버스를 만드는 경우입니다. 그렇게하면 그려지는 것을 완벽하게 제어 할 수 있습니다. – CaseyB
Arraylist 대신 그림 호출을 기록하기 위해 Picture 클래스를 사용할 수 있습니다. –
- 1. 안드로이드 캔버스가 신비하게 잘려서 그려집니다.
- 2. 안드로이드 sqlight - 항상 null
- 3. 캔버스가 Chromium에서 매우 상쾌하지 않음
- 4. 안드로이드 - 항상 검색 창을 활성화하십시오.
- 5. HTML5 캔버스가 찢어 지나요?
- 6. HTML5 캔버스가 복잡한 형상
- 7. 여러 캔버스가 비정상적으로 작동합니다.
- 8. 캔버스가 달린 타일셋을 사용합니다.
- 9. 캔버스가 일반적인 이미지보다 빠릅니까?
- 10. JPA OneToMany, 항상 비어 있습니다.
- 11. WPF는 항상 상위 노드에만 있습니다.
- 12. 네트워크 스트림은 항상 비어 있습니다!
- 13. 항상 wxFileConfig를 사용하도록 wxWidgets을 안내하는 가장 깨끗한 방법은 무엇입니까?
- 14. 안드로이드 : SQLite 쿼리에 문제가 있습니다.
- 15. 캔버스가 목록 안에있는 확장기 ZOrder
- 16. 안드로이드 drawCircle의 값이 항상 360 °가 아님
- 17. 캔버스가 너무 두꺼운 선을 그립니다.
- 18. 안드로이드 BroadcastReceiver, getResultData() 항상 null을 반환
- 19. 안드로이드 위에 항상 활동을 만드는 방법?
- 20. 안드로이드 데이터베이스의 rowid를 검색하려고하면 항상 0을 반환합니다.
- 21. 안드로이드 사진 선택에 startActivityForResult는 항상 RESULT_CANCELED
- 22. 안드로이드 - 수퍼는 항상 최후로 불리 죠?
- 23. 캔버스가 Word의 각 페이지에 삽입되었는지 확인
- 24. TaskDialog는 항상 Visual C++에서 최상위에 있습니다
- 25. SDL_Event.type은 폴링 후 항상 비어 있습니다.
- 26. 왼쪽의 내용이 항상 ie6의 가운데 위치에 있습니다.
- 27. Toolstripitem은 항상 메뉴 끝 부분에 있습니다
- 28. UserControl OnPaint에는 항상 {0,0,0,0}의 clipRect가 있습니다.
- 29. Safari JavaScript 디버거는 항상 비어 있습니다.
- 30. 등급이 아닌 rvalues는 항상 CV가없는 유형이 있습니다.
나는 이것을 단지 조금 전에 이해했다! 의견을 보내 주셔서 감사합니다! – CaseyB
버퍼에 그리기는 잘 작동하지만이 거대한 drawBitmap() 메서드는 FPS를 많이 먹습니다. ( –
지금은 나에게 병목이됩니다. 이전 상태를 복원 할 때마다 onDraw에서 전체 화면 비트 맵을 그리면 고해상도 장치의 FPS에 거의 영향을 미치지 않습니다. Kindle 8.9 3rd gen with 2560x1600). 캔버스가 이전 상태를 유지하도록하는 방법은 실제로 없습니까? OpenGL을 심화하면 성능 문제가 해결 될 수 있지만 시간적으로는 다릅니다. –