Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 位图是如何工作的?画布到底是什么?_Android_Canvas_Bitmap - Fatal编程技术网

Android 位图是如何工作的?画布到底是什么?

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;

我正在尝试创建一个绘图应用程序,并从Fingerpaint中找到了一个示例。我对示例进行了一些修改,并试图理解这是如何实现的。我举的例子如下

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。我仍然不知道这三个物体是做什么的,我希望我的回答能有所帮助