只显示一种颜色

时间:2017-06-07 14:40:00

标签: java android colors custom-view

我正在开发涂料应用程序问题是当我选择颜色和颜色然后选择不同颜色时,整个颜色变化为新颜色可以任何人告诉为什么会发生这种情况以及如何解决这个问题?以及如何添加橡皮擦? 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;}})

1 个答案:

答案 0 :(得分:1)

每次调用onDraw时,都会重绘整个画布。由于您只在自定义类中存储了一个paintColor,因此仅使用最后一个选择的paintColor。

您需要将颜色与关联的Point一起存储。然后,当您循环抛出mTouches数组时,可以更改当前Point颜色的颜色。

顺便说一下,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;
        }
    }
}