【问题标题】:Changing colour of paint changes all circle colurs更改油漆颜色会更改所有圆圈颜色
【发布时间】:2012-06-27 09:13:01
【问题描述】:

所以我试图制作一个在 touchevent 发生时绘制圆圈流的 android 应用程序。如果我在屏幕左侧绘制它应该绘制一个绿色圆圈,如果它在右侧,它应该绘制一个蓝色圆圈。该应用程序正在执行此操作,但它会更改已绘制的所有圆圈的颜色。所以我制作了一个 Draw circle Class 和一个对象数组列表,将每个 cricle 视为一个单独的对象,即使在 Touchup 事件之后仍然无法工作。下面给出了它的代码

 private class Drawcirlce  {

        public Drawcirlce(Canvas c) {
        // TODO Auto-generated constructor stub


        for (Point point : points) {

             if(flag==true)
                    c.drawCircle(point.x, point.y, 5, paint);
                    else
                    c.drawCircle(point.x, point.y, 5, p2);
        }
    invalidate();
    }
    /*for (Point point : points) {
     if(flag==true)
        mcan.drawCircle(point.x, point.y, 5, paint);
        else
        mcan.drawCircle(point.x, point.y, 5, p2);
}*/

}


public void onDraw(Canvas canvas) {


    i++;
     //Drawcirlce d=new Drawcirlce();
dc.add(new Drawcirlce(canvas));

Log.d(TAG, "i: " + i);invalidate();
}
public boolean onTouch(View view, MotionEvent event) {
    // if(event.getAction() != MotionEvent.ACTION_DOWN)
    // return super.onTouchEvent(event);
    Point point = new Point();
    point.x = event.getX();
    point.y = event.getY();
    if(point.x>200){
        paint.setColor(Color.BLUE);
    flag=true;
    }
    else{
        p2.setColor(Color.GREEN);
    flag=false;
    }

    points.add(point);
    //dc.add(new Drawcirlce(mcan));

    invalidate();
    Log.d(TAG, "point: " + point);
    return true;
}

public boolean onTouch(View view, MotionEvent event) {
    // if(event.getAction() != MotionEvent.ACTION_DOWN)
    // return super.onTouchEvent(event);
    Point point = new Point();
    point.x = event.getX();
    point.y = event.getY();
    if(point.x>200){
        paint.setColor(Color.BLUE);
    flag=true;
    }
    else{
        p2.setColor(Color.GREEN);
    flag=false;
    }

    points.add(point);
    //dc.add(new Drawcirlce(mcan));

    invalidate();
    Log.d(TAG, "point: " + point);
    return true;
}

任何人都知道我做错了什么,或者是否有办法解决这个问题?

【问题讨论】:

  • 你共享了不完整的代码,因此很难理解你的问题。我最好的猜测是你搞砸了标志变量

标签: java android graphics colors paint


【解决方案1】:

您的Drawcirlce 类中需要有一个Paint 对象。 (你可以将它公开给类,或者给它getPaint()setPaint(),无论哪个。)然后,当你调用c.drawCircle(point.x, point.y, 5, paint); 时,用类中的Paint 对象来调用它。

类似这样的:

private class Drawcirlce {
    public Paint myPaint;

    public void draw(Canvas c) { // Don't use a constructor here...
        if (myPaint == null)
            return;

        for (Point point : points) {
            c.drawCircle(point.x, point.y, 5, myPaint);
            invalidate();
        }
    }
}

然后,在您的 onTouch 事件中,您执行以下操作:

Drawcirlce myCircle = new Drawcirlce();
if (flag == true)
    myCircle.myPaint = new Paint(paint); // Copies the current paint object.
else
    myCircle.myPaint = new Paint(p2); // Copies the current p2 object.
dc.add(); // Adds our circle with its own Paint object.

最后,您必须更改您的 onDraw 事件。

for (Drawcirlce d : dc) { // Loop through everything in the dc array.
    d.draw(canvas); // Draw it to this canvas!
}

这段代码实际上赋予了一个圆拥有自己的Paint 对象的能力。然后,在触摸时,您创建一个Paint 来提供它。最后,在绘图时,您使用 Paint 而不是当前的。

【讨论】:

  • 嘿,谢谢你的回复,但它似乎没有做任何事情。认为它在错误的画布上绘图 =/
  • 类中的MyPaint好像一直为null =/
  • 好吧,它的画,但仍然做同样的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2020-11-05
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多