Android 位图是如何工作的?画布到底是什么?
我正在尝试创建一个绘图应用程序,并从Fingerpaint中找到了一个示例。我对示例进行了一些修改,并试图理解这是如何实现的。我举的例子如下Android 位图是如何工作的?画布到底是什么?,android,canvas,bitmap,Android,Canvas,Bitmap,我正在尝试创建一个绘图应用程序,并从Fingerpaint中找到了一个示例。我对示例进行了一些修改,并试图理解这是如何实现的。我举的例子如下 public class TestView extends View { private Paint mPaint; private Paint mBitmapPaint; private Bitmap mBitmap; private Canvas mCanvas; private Path mPath;
public class TestView extends View {
private Paint mPaint;
private Paint mBitmapPaint;
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
public TestView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
mPath = new Path();
mBitmapPaint = new Paint();
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(20);
}
@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);
mCanvas = new Canvas(mBitmap);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
private void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
mX = x;
mY = y;
}
}
private void touch_up() {
mPath.lineTo(mX, mY);
// commit the path to our offscreen
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath.reset();
}
private float mX, mY;
private static final float TOUCH_TOLERANCE = 4;
private void touch_start(float x, float y) {
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);
invalidate();
break;
case MotionEvent.ACTION_UP:
touch_up();
invalidate();
break;
}
return true;
}
}
我了解如何构造和使用mPaint
。我不理解的是onSizeChanged()
中的代码和这行canvas.drawBitmap(mBitmap,0,0,mbitMapPoint);
。为什么需要新的画布
?创建mBitmap
的目的是什么?我们为什么要画位图?为什么将颜色设置为mBitmapPaint
没有任何作用?基本上,我不明白mBitmap
、mCanvas
和mBitmap
做什么。但是如果我把这些注释掉,这个例子就行不通了 官方文件有什么问题?没问题。该示例也取自android sdk。我了解线条是如何绘制的,Path是如何记录线条的。但我不明白mBitmap、mCanvas和mBitmapPaint是做什么的。它们似乎有不同的行为,mPath、canvas和mPaintokay好吧,标题有点混乱:)但您仍然应该参考文档,并表明您确实理解了所涉及的基本概念。更好的是,使用调试器并逐步完成代码来查看发生了什么。在onDraw完成之前注入断点并运行调试模式时,我没有看到任何事情发生。我试着推荐出3个我不理解的物体来观察效果。同时在mPaint和mBitmapPaint上调用setColor。我仍然不知道这三个物体是做什么的,我希望我的回答能有所帮助