时间只显示一种颜色

only one color is displayed in time

我正在开发绘画应用程序,问题是当我选择颜色和绘画,然后选择不同的颜色时,整个绘画颜色变为新颜色,谁能告诉我为什么会发生这种情况以及如何解决这个问题?以及如何为此添加橡皮擦? imageview DrawView 在这里:

public class DrawView extends ImageView {
    private ArrayList<Point> mTouches;
    int paintColor;
    public int setcolor(int a){
        paintColor=a;
        return paintColor;}
    // Java constructor
    public DrawView(Context context) {
        super(context);
        init();}
    // XML constructor
    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();}
    private void init() {
        mTouches = new ArrayList<Point>();}
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Capture a reference to each touch for drawing
        float touchX = event.getX();
        float touchY = event.getY();
        mTouches.add(new Point(Math.round(touchX), Math.round(touchY)));
        return super.onTouchEvent(event);}
    @Override
    protected void onDraw(Canvas c) {
        // Let the image be drawn first
        super.onDraw(c);
        // Draw your custom points here
        Paint paint = new Paint();
        paint.setColor(paintColor);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.FILL);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeCap(Paint.Cap.ROUND);
        for (Point p : mTouches) {
            c.drawCircle( p.x, p.y,15,paint);}} }

我的主要是:

im.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                DrawView mcustomImagview = (DrawView) v;
                mcustomImagview.setcolor(color);
                mcustomImagview.invalidate();
                if (v.onTouchEvent(event)) {
// Do something with event.getX(), event.getY() }
                return true;}})

每调用一次onDraw,整个canvas都会重绘。由于您在自定义 class 中仅存储一种 paintColor,因此仅使用最后选择的一种。

您需要将颜色与关联的点一起存储。然后当你循环抛出你的mTouches数组时,你改变了当前点的颜色。

顺便说一句,Paint 对象可以更新,因此您不需要每次都创建它,因为在 onDraw.

中创建新对象是一种不好的做法

编辑

public class DrawView extends android.support.v7.widget.AppCompatImageView {
    private ArrayList<ColouredPoint> mTouches;
    // Current used colour
    private int mCurrColour;
    private Paint mPaint;

    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() {
        mTouches = new ArrayList<>();
        mPaint = new Paint();
        mPaint.setColor(mCurrColour);
        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(5);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Capture a reference to each touch for drawing
        float touchX = event.getX();
        float touchY = event.getY();
        mTouches.add(new ColouredPoint(Math.round(touchX), Math.round(touchY), mCurrColour));

        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(Canvas c) {
        // Let the image be drawn first
        super.onDraw(c);
        // Draw your custom points here
        for (ColouredPoint p : mTouches) {
            mPaint.setColor(p.colour);
            c.drawCircle(p.x, p.y, 15, mPaint);
        }
    }

    /**
     * Class to store the coordinate and the colour of the point.
     */
    private class ColouredPoint {
        int x;
        int y;
        int colour;

        public ColouredPoint(int x, int y, int colour) {
            this.x = x;
            this.y = y;
            this.colour = colour;
        }
    }
}