Android 位图更改将使视图在onDraw()和invalidate调用之前自动刷新
我对View.onDraw()有一个奇怪的问题,我有一个画布,可以用位图绘制一些文本,在onDraw方法中,我使用View hold画布绘制位图。当用户触摸时,我调用开始拖动,然后对位图进行一些更改,但我从未执行查看.无效(),我认为位图的任何更改都不会影响BoardView UI,因为我没有使其无效以刷新,但它会立即使用位图的新更改进行刷新,而无需onDraw()调用时,我在onDraw的第一行设置了一个断点并进行了调试,但onDraw没有调用。在那之后,我在startDraging()之后调用invalidate(),在第一行停止onDraw调用,但我看到BoardView已经刷新了。Android 位图更改将使视图在onDraw()和invalidate调用之前自动刷新,android,canvas,bitmap,Android,Canvas,Bitmap,我对View.onDraw()有一个奇怪的问题,我有一个画布,可以用位图绘制一些文本,在onDraw方法中,我使用View hold画布绘制位图。当用户触摸时,我调用开始拖动,然后对位图进行一些更改,但我从未执行查看.无效(),我认为位图的任何更改都不会影响BoardView UI,因为我没有使其无效以刷新,但它会立即使用位图的新更改进行刷新,而无需onDraw()调用时,我在onDraw的第一行设置了一个断点并进行了调试,但onDraw没有调用。在那之后,我在startDraging()之后调
我不知道他们在onDraw()之前做了什么,Canvas会知道我更改位图并立即使用它吗?我认为所有的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方法有一点不同。工作良好的版本是useandroid.view.Surface$compatibleCavas,而工作错误的版本是useandroid.view.GLES20RecordingCanvas,我不再使用OpenGL调用了,所以我不知道为什么要使用它,这种差异是否让我错了?
---------------更新1--------------我在看,他们说“如果你为一个视图设置了一个可绘制的背景,那么该视图将在调用其onDraw()方法之前为你绘制它”,所以我已经确认我没有将背景设置为以XML定义或编程方式查看。
所说的“Android框架只需要调用OnDRAW()”,框架是否考虑更改位图是不必要的调用()?< P/> < P>我认为我犯了一个愚蠢的错误,我设置了<强> Android:ToalStdkValue< /St>> 16,所以将我的源代码编译为API级别16,我把它改为10,然后解决问题,非常非常愚蠢
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" />