Android:在给定图像上自定义绘制(使用SurfaceView)

Android:在给定图像上自定义绘制(使用SurfaceView),android,bitmap,android-canvas,surfaceview,Android,Bitmap,Android Canvas,Surfaceview,我试图加载一个图像到SurfaceView,并在此图像上画一些划痕 为此,我创建了一个自定义SurfaceView,MySurfaceView,它具有以下功能: public MySurfaceView(Context context, AttributeSet attrs) { super(context, attrs); mHolder = getHolder(); mHolder.addCallback(this); mPaint.setStyle(Pain

我试图加载一个图像到SurfaceView,并在此图像上画一些划痕

为此,我创建了一个自定义SurfaceView,MySurfaceView,它具有以下功能:

public MySurfaceView(Context context, AttributeSet attrs)
{
    super(context, attrs);
    mHolder = getHolder();
    mHolder.addCallback(this);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(3);
    mPaint.setColor(Color.WHITE);
    setWillNotDraw(false);
}
public void setImageBitmap(Bitmap bitmap) {
    mBitmap = bitmap;
}
@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(mBitmap, x, y, null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        mPath = new Path();
        mPath.moveTo(event.getX(), event.getY());
    } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
        mPath.lineTo(event.getX(), event.getY());
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
        mPath.lineTo(event.getX(), event.getY());
    }
    if (mPath != null) {
        Canvas canvas = mHolder.lockCanvas();
        canvas.drawPath(mPath, mPaint);
        mHolder.unlockCanvasAndPost(canvas);
    }
    return true;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {

}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {

}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}
基本上,如果在构造函数中保持setWillNotDraw(false),SurfaceView将显示我设置的位图mBitmap。否则,如果我对此进行注释,它将允许我在黑色背景上绘制路径

有没有什么方法我可以同时做到这两个,把图像(mBitmap)放在背景中,并在这张图像上绘制路径?你们能提供一些代码吗。非常感谢

我明白了

它基本上也将绘制路径设置为onDraw(Canvas-Canvas)函数。确保绘制路径后SurfaceView调用onDraw。我们需要在触控事件中调用invalidate()

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(mBitmapScaled, x, y, null);
    if (mPath != null) {
        canvas.drawPath(mPath, mPaint);
    }
}
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        mPath = new Path();
        mPath.moveTo(event.getX(), event.getY());
    } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
        mPath.lineTo(event.getX(), event.getY());
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
        mPath.lineTo(event.getX(), event.getY());
    }
    invalidate();
    return true;
}

或者更好的是,您可以将mPath更改为ArrayList,以便在图像上放置更多路径。

您的渲染代码位于两个不同的位置。在onDraw()中绘制所有图形,包括位图和路径。通过向视图发送无效事件来启动绘图。谢谢!如何在onDraw中绘制路径?我认为绘图路径必须由onTouchEvent()触发,对吗?