Android canvas.drawBitmap 非常慢 ARGB_8888
Android canvas.drawBitmap very slow with ARGB_8888
我是 Android 编码的新手,但我想为平板电脑制作一个可以手写的应用程序(我知道已经有很多了,但我想要自己的一个) )
我从整个 Internet 上收集了一些代码,现在我想添加橡皮擦模式。为此,我正在创建一个位图,然后将其添加到 Canvas 上。
一切正常,但是 Bitmap 有 Bitmap.Configuration.ARGB_8888
并且在绘制时速度很慢,所以它落后了。我试过 Bitmap.Configuration.RGB_565
没有性能问题,但有其他擦除问题。
我也发现了,这显然与Bitmap的大小有关。我的平板电脑的屏幕分辨率为 1920x1200。当我只用 1557x1000
创建位图时,我没有性能问题,但是当我将它增加到 1558x1000
或更高时,它又开始滞后了。
这是我的部分代码:
class 绘图视图:
public class DrawView extends SurfaceView implements View.OnTouchListener{
private Paint paint;
private Paint bitmapPaint;
private Path path;
private Canvas canvas;
private Bitmap mBitmap;
private int currentColor;
private float currentStrokeWidth;
private boolean eraserMode = false;
public DrawView(Context context, AttributeSet attr) {
super(context, attr);
path = new Path();
paint = new Paint();
bitmapPaint = new Paint(Paint.DITHER_FLAG);
this.setOnTouchListener(this);
paint.setAntiAlias(true);
paint.setDither(true);
paint.setFilterBitmap(false);
// ... setting Color and StorkeWidth to paint
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
canvas = new Canvas(mBitmap);
}
@Override
protected void onDraw(Canvas c){
c.drawBitmap(mBitmap, 0, 0, bitmapPaint);
c.drawPath(path, paint);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(eventX, eventY);
break;
case MotionEvent.ACTION_MOVE:
touch_move(eventX, eventY);
break;
case MotionEvent.ACTION_UP:
touch_up();
break;
default:
return false;
}
invalidate();
}
return true;
}
private float mX, mY;
private void touch_start(float x, float y) {
path.moveTo(x, y);
mX = x;
mY = y;
}
private void touch_move(float x, float y) {
path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
canvas.drawPath(path, paint);
mX = x;
mY = y;
}
private void touch_up() {
canvas.drawPath(path, paint);
path.reset();
}
}
如果有人能帮我解决这个问题,我很高兴。
我自己修好了。
我意识到我用 setBackgroundResource(R.drawable.background)
设置的背景图像分辨率太高,我降低了它,现在它可以工作了。我不知道为什么这会影响绘图性能,但这解释了为什么我在互联网上没有找到任何答案
我是 Android 编码的新手,但我想为平板电脑制作一个可以手写的应用程序(我知道已经有很多了,但我想要自己的一个) )
我从整个 Internet 上收集了一些代码,现在我想添加橡皮擦模式。为此,我正在创建一个位图,然后将其添加到 Canvas 上。
一切正常,但是 Bitmap 有 Bitmap.Configuration.ARGB_8888
并且在绘制时速度很慢,所以它落后了。我试过 Bitmap.Configuration.RGB_565
没有性能问题,但有其他擦除问题。
我也发现了,这显然与Bitmap的大小有关。我的平板电脑的屏幕分辨率为 1920x1200。当我只用 1557x1000
创建位图时,我没有性能问题,但是当我将它增加到 1558x1000
或更高时,它又开始滞后了。
这是我的部分代码:
class 绘图视图:
public class DrawView extends SurfaceView implements View.OnTouchListener{
private Paint paint;
private Paint bitmapPaint;
private Path path;
private Canvas canvas;
private Bitmap mBitmap;
private int currentColor;
private float currentStrokeWidth;
private boolean eraserMode = false;
public DrawView(Context context, AttributeSet attr) {
super(context, attr);
path = new Path();
paint = new Paint();
bitmapPaint = new Paint(Paint.DITHER_FLAG);
this.setOnTouchListener(this);
paint.setAntiAlias(true);
paint.setDither(true);
paint.setFilterBitmap(false);
// ... setting Color and StorkeWidth to paint
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
canvas = new Canvas(mBitmap);
}
@Override
protected void onDraw(Canvas c){
c.drawBitmap(mBitmap, 0, 0, bitmapPaint);
c.drawPath(path, paint);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(eventX, eventY);
break;
case MotionEvent.ACTION_MOVE:
touch_move(eventX, eventY);
break;
case MotionEvent.ACTION_UP:
touch_up();
break;
default:
return false;
}
invalidate();
}
return true;
}
private float mX, mY;
private void touch_start(float x, float y) {
path.moveTo(x, y);
mX = x;
mY = y;
}
private void touch_move(float x, float y) {
path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
canvas.drawPath(path, paint);
mX = x;
mY = y;
}
private void touch_up() {
canvas.drawPath(path, paint);
path.reset();
}
}
如果有人能帮我解决这个问题,我很高兴。
我自己修好了。
我意识到我用 setBackgroundResource(R.drawable.background)
设置的背景图像分辨率太高,我降低了它,现在它可以工作了。我不知道为什么这会影响绘图性能,但这解释了为什么我在互联网上没有找到任何答案