0

touchevent が発生したときに円のストリームを描画する android アプリケーションを作成しようとしています。画面の左側に描画すると緑色の円が描画され、右側に描画すると青色の円が描画されます。アプリはこれを行っていますが、既に描画されているすべての円の色を変更します。SO私はDraw circle Classとオブジェクトの配列リストを作成して、各クリクルを個別のオブジェクトとして扱いましたが、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;
}

誰でも私が間違っていることを知っていますか、またはこれを回避する方法はありますか?

4

1 に答える 1

2

クラスDrawcirlceにはPaintオブジェクトが必要です。getPaint()(これをクラスに public にするか、とのいずれかを与えることができ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は、現在のものの代わりにそれを使用します。

于 2012-06-26T04:43:38.893 に答える