2012-06-26 298 views
0

所以即时通讯设法使一个adroid应用程序绘制圆形流作为touchevent发生。如果我在屏幕的左侧绘制,它应该画一个绿色的圆圈,如果它在右侧,它应该绘制一个蓝色的圆圈。该应用程序正在这样做,但它会更改已绘制的所有圆圈的颜色。所以我做了一个Draw circle类和一个对象数组列表,将每个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; 
} 

任何一个知道aht即时通讯做错了,或者如果有一种方法解决这个问题?

+0

你有共享不完整的代码,因此很难理解你的问题。我最好的猜测是你搞砸了国旗变量 – the100rabh

回答

2

您的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而不是当前的。

+0

嘿,谢谢你的回复,但它似乎没有做任何事情。认为它画在错误的画布上=/ – user1472707

+0

看起来,类中的MyPaint始终为空=/ – user1472707

+0

好吧,它的绘画,但仍然在做同样的事情 – user1472707