Java 如何将图像添加到画布,以便我可以在画布上画线

Java 如何将图像添加到画布,以便我可以在画布上画线,java,android,android-custom-view,paint,Java,Android,Android Custom View,Paint,我有自定义视图的代码,但无法理解如何设置图像,以便在图像上绘图。我尝试了stackoverflow上提供的解决方案,但图像没有添加。有人能帮我吗,请检查下面给出的代码: 或者如何将图像设置为customview的背景。我只获得白色背景 public class CustomView extends View { private static final String LOG_CAT = CustomView.class.getSimpleName(); //drawing p

我有自定义视图的代码,但无法理解如何设置图像,以便在图像上绘图。我尝试了stackoverflow上提供的解决方案,但图像没有添加。有人能帮我吗,请检查下面给出的代码:

或者如何将图像设置为customview的背景。我只获得白色背景

public class CustomView extends View {

    private static final String LOG_CAT = CustomView.class.getSimpleName();

    //drawing path
    private Path drawPath;

    //defines what to draw
    private Paint canvasPaint;

    //defines how to draw
    private Paint drawPaint;

    //initial color
    private int paintColor = 0xFF660000;

    private Paint _paintBlur;


    //canvas - holding pen, holds your drawings
    //and transfers them to the view
    private Canvas drawCanvas;

    //canvas bitmap
    private Bitmap canvasBitmap;

    //brush size
    private float currentBrushSize, lastBrushSize;

    private ArrayList<Path> paths = new ArrayList<Path>();
    private ArrayList<Path> undonePaths = new ArrayList<Path>();
    private float mX, mY;
    private static final float TOUCH_TOLERANCE = 4;

    private void init(){
        currentBrushSize = 20;
        lastBrushSize = currentBrushSize;

        drawPath = new Path();
        drawPaint = new Paint();
        drawPaint.setColor(paintColor);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(currentBrushSize);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);

        canvasPaint = new Paint(Paint.DITHER_FLAG);

        this._paintBlur = new Paint();
        this._paintBlur.set(drawPaint);
        this._paintBlur.setAntiAlias(true);
        this._paintBlur.setDither(true);
        this._paintBlur.setStyle(Paint.Style.STROKE);
        this._paintBlur.setStrokeJoin(Paint.Join.ROUND);
        this._paintBlur.setStrokeCap(Paint.Cap.ROUND);
        this._paintBlur.setColor(Color.RED);
        this._paintBlur.setStrokeWidth(6);
        this._paintBlur.setMaskFilter(new BlurMaskFilter(10.0F, BlurMaskFilter.Blur.OUTER));

    }


    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        for (Path p : paths) {
            canvas.drawPath(p, drawPaint);
        }
        canvas.drawPath(drawPath, drawPaint);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
       //create canvas of certain device size.
        super.onSizeChanged(w, h, oldw, oldh);


        //create Bitmap of certain w,h
       canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

        //apply bitmap to graphic to start drawing.
        drawCanvas = new Canvas(canvasBitmap);

        drawCanvas.drawBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.one),0,0,drawPaint);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float touchX = event.getX();
        float touchY = event.getY();

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                touch_start(touchX, touchY);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                touch_move(touchX, touchY);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                touch_up();
                invalidate();
                break;
            default:
                return false;
        }
        return true;
    }


    private void touch_start(float x, float y) {
        undonePaths.clear();
        drawPath.reset();
        drawPath.moveTo(x, y);
        mX = x;
        mY = y;
    }

    private void touch_up() {
        drawPath.lineTo(mX, mY);
        drawCanvas.drawPath(drawPath, drawPaint);
        paths.add(drawPath);
        drawPath = new Path();

    }

    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) {
            drawPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
            mX = x;
            mY = y;
        }
    }


    public void onClickUndo () {
       if (paths.size()>0)
        {
            undonePaths.add(paths.remove(paths.size()-1));
            invalidate();
        }
    }
}
公共类CustomView扩展了视图{
私有静态最终字符串LOG_CAT=CustomView.class.getSimpleName();
//绘图路径
专用路径;
//定义要绘制的内容
私人油漆画布;
//定义如何绘制
私人油漆;
//原色
私有int paintColor=0xFF660000;
私人涂料(paintBlur),;
//画布-拿着笔,拿着你的画
//并将它们转移到视图中
私人帆布;
//画布位图
私有位图画布位图;
//刷子大小
私有浮动currentBrushSize、lastBrushSize;
私有ArrayList路径=新ArrayList();
private ArrayList undonePaths=new ArrayList();
私人浮动mX,我的;
专用静态最终浮动接触公差=4;
私有void init(){
电流刷大小=20;
lastBrushSize=currentBrushSize;
drawPath=新路径();
drawPaint=新油漆();
drawPaint.setColor(paintColor);
drawPaint.setAntiAlias(真);
drawPaint.setStrokeWidth(当前笔刷大小);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeJoin(绘制.连接.圆形);
drawPaint.setStrokeCap(油漆盖圆形);
画布绘制=新绘制(绘制抖动标志);
这个。_paintBlur=新油漆();
此._paintBlur.set(drawPaint);
此._paintBlur.setAntiAlias(true);
此._paintBlur.setDither(true);
这个.u paintBlur.setStyle(Paint.Style.STROKE);
这个.u paintBlur.setStrokeJoin(Paint.Join.ROUND);
此._paintBlur.setStrokeCap(Paint.Cap.ROUND);
这个.u paintBlur.setColor(Color.RED);
此._paintBlur.设置行程宽度(6);
这个.u paintBlur.setMaskFilter(新的BlurMaskFilter(10.0F,BlurMaskFilter.Blur.OUTER));
}
公共自定义视图(上下文、属性集属性){
超级(上下文,attrs);
init();
}
@凌驾
受保护的void onDraw(画布){
用于(路径p:路径){
画布.drawPath(p,drawPaint);
}
canvas.drawPath(drawPath,drawPaint);
}
@凌驾
已更改尺寸的受保护空心(整数w、整数h、整数oldw、整数oldh){
//创建特定设备大小的画布。
super.onSizeChanged(w,h,oldw,oldh);
//创建特定w、h的位图
canvasBitmap=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
//将位图应用于图形以开始绘图。
drawCanvas=新画布(画布位图);
drawCanvas.drawBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.one),0,0,drawPaint);
}
@凌驾
公共布尔onTouchEvent(运动事件){
float touchX=event.getX();
float touchY=event.getY();
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
触摸启动(触摸X,触摸Y);
使无效();
打破
case MotionEvent.ACTION\u移动:
触摸移动(触摸X,触摸Y);
使无效();
打破
case MotionEvent.ACTION\u UP:
润色;
使无效();
打破
违约:
返回false;
}
返回true;
}
专用无效触摸启动(浮动x、浮动y){
撤销海王星。清除();
drawPath.reset();
绘制路径。移动到(x,y);
mX=x;
mY=y;
}
私人空间修补(){
drawPath.lineTo(mX,mY);
drawCanvas.drawPath(drawPath,drawPaint);
添加(drawPath);
drawPath=新路径();
}
私有无效触摸移动(浮动x、浮动y){
float dx=Math.abs(x-mX);
float dy=Math.abs(y-mY);
如果(dx>=接触公差| | dy>=接触公差){
drawPath.quadTo(mX,mY,(x+mX)/2,(y+mY)/2);
mX=x;
mY=y;
}
}
公共void onClickUndo(){
if(path.size()>0)
{
undonePaths.add(path.remove(path.size()-1));
使无效();
}
}
}

我用错误的方法绘制图像: 下一行必须用onDraw()方法编写

drawCanvas.drawBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.one),0,0,drawPaint);