2012-06-26 6 views
0

Итак, я пытаюсь сделать приложение для adroid, которое рисует поток кругов, как touchhevent. Если я рисую на левой стороне экрана, он должен нарисовать зеленый круг, и если он справа, он должен нарисовать синий круг. Приложение делает это, но оно меняет цвет всех уже нарисованных кругов. SO сделал класс Draw circle и список объектов массивов для обработки каждого cricle как отдельного объекта objec, все еще не работающего даже после события 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; 
} 

Любой знает, что я делаю неправильно, или если это способ обойти это?

+0

u поделился неполным кодом, поэтому сложно понять проблему ур. Мое лучшее предположение - это то, что у ввернуты переменные флага. – 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 в классе всегда имеет значение null =/ – user1472707

+0

Хорошо, его живопись, но все еще делает то же самое. – user1472707

Смежные вопросы