覆盖onDraw以更改绘图的方式(Android)

我怎样才能重写onDraw以便我将绘制(作为一个位图),并将其转换?

下面的方法工作,但不幸的是,这种方法涉及创build一个整个屏幕大小的位图 – 而不仅仅是绘制的区域。 如果我使用它来绘制UI元素,则会为每个UI元素重绘。 这可以更有效地完成吗?

 @Override protected void onDraw(Canvas canvas) { //TODO: Reduce the burden from multiple drawing Bitmap bitmap=Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Config.ARGB_8888); Canvas offscreen=new Canvas(bitmap); super.onDraw(offscreen); //Then draw onscreen Paint p=new Paint(); p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN)); canvas.drawBitmap(bitmap, 0, 0, p); } 

你有没有尝试改变你创build的位图的大小,只是等于剪辑边界,而不是给定的canvas的整个大小? 我不知道是否所有视图都是这种情况,但我发现某些视图的onDraw方法被赋予了与屏幕一样大的canvas,而与内容的实际大小无关。 然后剪切canvas,仅将canvas限制在左上angular,然后绘制到canvas上,然后在实际准备显示整个布局时将该部分翻译到屏幕上的其他位置。 换句话说,尽pipe它具有整个屏幕大小的canvas,但它实际上只使用了一小部分。 所以你可以尝试做的不是使用

 Bitmap bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), ...) 

你可以试试

 Rect rect = canvas.getClipBounds(); int width = rect.width(); int height = rect.height(); Bitmap bitmap = Bitmap.createBitmap(width, height, ...); 

这样可以减less使用比所需要的大得多的位图的开销。 注意:我没有真的试过这样做,所以它可能无法正常工作,但值得一试。

下面的代码将会更有效率。

 public class MyView extends TextView{ private Canvas offscreen; public MyView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); } public MyView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { //We want the superclass to draw directly to the offscreen canvas so that we don't get an infinitely deep recursive call if(canvas==offscreen){ super.onDraw(offscreen); } else{ //Our offscreen image uses the dimensions of the view rather than the canvas Bitmap bitmap=Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888); offscreen=new Canvas(bitmap); super.draw(offscreen); //Create paint to draw effect Paint p=new Paint(); p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN)); //Draw on the canvas. Fortunately, this class uses relative coordinates so that we don't have to worry about where this View is actually positioned. canvas.drawBitmap(bitmap, 0, 0, p); } } } 

我遇到类似的东西,其中canvas.getWidth()和canvas.getHeight()返回整个屏幕的宽度和高度,而不是视图本身。

尝试使用下面的代替:

 Bitmap bitmap=Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888); 

对于我的情况,getWidth()和getHeight()返回我的视图的维度。 祝你好运!