Java 第一条路径不是';t油漆

Java 第一条路径不是';t油漆,java,android,image,draw,custom-view,Java,Android,Image,Draw,Custom View,我创建了一个自定义视图,用于在位图上绘制。问题是当尝试绘制第一次触摸时没有显示任何内容,并且颜色在下次也会更改,第二个问题是当我保存图像时,绘制的颜色中没有显示任何内容 这是我的密码: public class DrawView extends android.support.v7.widget.AppCompatImageView { private ArrayList<ColouredPoint> paths ; private ColouredPoint mPa

我创建了一个自定义视图,用于在位图上绘制。问题是当尝试绘制第一次触摸时没有显示任何内容,并且颜色在下次也会更改,第二个问题是当我保存图像时,绘制的颜色中没有显示任何内容

这是我的密码:

public class DrawView extends android.support.v7.widget.AppCompatImageView {
    private ArrayList<ColouredPoint> paths ;
    private ColouredPoint mPath;
    private Paint mPaint;
    private static final float TOUCH_TOLERANCE = 4;
    boolean erase;
    // Current used colour
    private int mCurrColour;
    public void setErase(boolean era){
        erase=era;
    }
    public void setColor(int colour) {
        mCurrColour = colour;
    }

    public DrawView(Context context) {
        super(context);
        init();
    }

    // XML constructor
    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        paths = new ArrayList<>();
        mPaint = new Paint();
        mPath = new ColouredPoint(mCurrColour);
        mPaint.setColor(mCurrColour);
        mPaint.setDither(true);
        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(15);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
    }
    private float mX, mY;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Capture a reference to each touch for drawing
        float x = event.getX();
        float y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPath.reset();
                mPath.moveTo(x, y);
                mX = x;
                mY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                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;}
                break;
            case MotionEvent.ACTION_UP:
                mPath.lineTo(mX, mY);
                mPath = new ColouredPoint(mCurrColour);
                paths.add(mPath);
                break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(Canvas c) {
        // Let the image be drawn first
        super.onDraw(c);
        // Draw your custom points here
        if(!erase){
            for (ColouredPoint i:paths) {
                mPaint.setColor(i.colour);
                c.drawPath(i, mPaint);}}
        else if (paths.size()>0){
            paths.remove(paths.size()-1);

        } else {
            Toast.makeText(getContext(), "Undo unknown", Toast.LENGTH_SHORT)
                    .show();}}
    /**
     * Class to store the coordinate and the colour of the point.
     */
    private class ColouredPoint extends Path{
        int colour;

        public ColouredPoint(int colour) {

            this.colour = colour;
        }
    }
}
公共类DrawView扩展了android.support.v7.widget.AppCompatImageView{
私有数组列表路径;
私人着色点mPath;
私人油漆;
专用静态最终浮动接触公差=4;
布尔擦除;
//当前使用的颜色
私人国际色彩;
公共void setErase(布尔纪元){
擦除=纪元;
}
公共空间设置颜色(内部颜色){
mCurrColour=颜色;
}
公共绘图视图(上下文){
超级(上下文);
init();
}
//XML构造函数
公共绘图视图(上下文、属性集属性){
超级(上下文,attrs);
init();
}
私有void init(){
路径=新的ArrayList();
mPaint=新油漆();
mPath=新着色点(mCurrColour);
mPaint.setColor(mCurrColour);
mPaint.setDither(true);
mPaint.setAntiAlias(true);
mPaint.设定行程宽度(15);
mPaint.setStyle(油漆、样式、笔划);
mPaint.setStrokeJoin(油漆.连接.圆形);
mPaint.setStrokeCap(油漆盖圆形);
}
私人浮动mX,我的;
@凌驾
公共布尔onTouchEvent(运动事件){
//为绘图捕获每个触摸的参考
float x=event.getX();
float y=event.getY();
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
mPath.reset();
移动到(x,y)的速度;
mX=x;
mY=y;
打破
case MotionEvent.ACTION\u移动:
float dx=Math.abs(x-mX);
float dy=Math.abs(y-mY);
如果(dx>=接触公差| | dy>=接触公差){
兆帕四分之一秒(mX,mY,(x+mX)/2,(y+mY)/2);
mX=x;
mY=y;}
打破
case MotionEvent.ACTION\u UP:
mPath.lineTo(mX,mY);
mPath=新着色点(mCurrColour);
路径。添加(mPath);
打破
}
返回super.onTouchEvent(事件);
}
@凌驾
受保护的void onDraw(画布c){
//让我们先画图像
super.onDraw(c);
//在此处绘制自定义点
如果(!擦除){
用于(彩色点i:路径){
mPaint.setColor(i.color);
c、 绘图路径(i,mPaint);}
else if(path.size()>0){
path.remove(path.size()-1);
}否则{
Toast.makeText(getContext(),“Undo unknown”,Toast.LENGTH\u SHORT)
.show();}
/**
*类来存储点的坐标和颜色。
*/
私有类coloredpoint扩展路径{
内部色彩;
公共着色点(内部颜色){
这个颜色=颜色;
}
}
}

如何解决此问题?

make
mPath=new coloredpoint(mCurrColour)作为
init()中的最后一行
谢谢你能告诉我如何用位图保存绘画吗?它以前工作过,但我不知道它为什么停止用图像保存绘画@jafarbtechsee链接在位图中绘制否这不是我的问题,问题是在现有位图上绘制后,我想保存图像并在其上绘制,但我不能这样做,我不知道为什么@jafarbtech@jafarbtechmake
mPath=新着色点(mCurrColour)作为
init()中的最后一行
谢谢你能告诉我如何用位图保存绘画吗?它以前工作过,但我不知道它为什么停止用图像保存绘画@jafarbtechsee链接在位图中绘制否这不是我的问题,问题是在现有位图上绘制后,我想保存图像并在其上绘制,但我不能这样做,我不知道为什么@jafarbtech@jafarbtech