我有一个关于View.onDraw()的奇怪问题,我有一个Canvas用Bitmap绘制一些文本,在onDraw方法中,我绘制Bitmap使用View hold Canvas。当用户触摸时,我调用 startDragging 然后对Bitmap进行一些更改,但我从不执行 View.invalidate(),我认为Bitmap的任何更改都不会影响BoardView用户界面,因为我没有使其无效以进行刷新,但是在没有 onDraw()调用的情况下刷新了Bitmap 的新更改,我在onDraw第一行设置了一个断点,调试,但onDraw没有调用。之后,我在startDragging()之后调用invalidate(),我在第一行调用onDraw时停止但是我看到BoardView已经刷新了。
我不知道他们在onDraw()之前做了什么,Canvas会不会知道我改变Bitmap并立即使用它?我认为所有UI更改都会调用onDraw方法,它可以控制如何更改,是不是我错了?
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class BoardView extends View {
public BoardView(Context context, AttributeSet attrs) {
super(context, attrs);
}
private Bitmap mMainPageBitmap;
private Canvas mDrawableCanvas;
@Override
protected void onDraw(Canvas canvas) {
if (mMainPageBitmap == null) initDrawing(canvas.getWidth(), canvas.getHeight());
canvas.drawBitmap(mMainPageBitmap, 0, 0, null);
}
private void initDrawing(int width, int height) {
mMainPageBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
mDrawableCanvas = new Canvas();
drawCurrentPage();
}
private void drawCurrentPage() {
mDrawableCanvas.setBitmap(mMainPageBitmap);
mDrawableCanvas.save(Canvas.MATRIX_SAVE_FLAG);
mDrawableCanvas.translate(10, 20);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLUE);
paint.setTextSize(30);
mDrawableCanvas.drawLine(0, 50, getWidth(), 50, paint);
mDrawableCanvas.drawText("test", 0, 4, 0, 0, paint);
mDrawableCanvas.restore();
}
public void startDragging() {
drawCurrentPage();
// invalidate();
}
}
我有另一个项目做了同样但没有这个问题,我仔细比较然后我发现有关Canvas实例的onDraw方法有一点区别。工作好的版本是使用 android.view.Surface $ CompatibleCanvas ,而工作错误的版本是使用 android.view.GLES20RecordingCanvas ,我不再有OpenGL调用了,所以我不知道它为什么用,这有什么不同让我错了?
--------------- 更新1 ---------------
我看着Android View Drawing,他们说“如果你为View设置了一个背景可绘制,那么View会在回调它的onDraw()方法之前为你绘制它”,所以我确认我没有'设置背景以既不查看XML定义,也不以编程方式查看。
Android 2d-graphics说“Android框架只会根据需要调用onDraw()”,框架是否考虑更改Bitmap是不必调用onDraw()?
答案 0 :(得分:0)
我认为我犯了一个愚蠢的错误,我设置 android:targetSdkVersion = 16所以平台编译我的源代码为API级别16,我将其更改为10然后解决问题,非常非常愚蠢。
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" />