4

オンタッチ方式で線を引こうとしています。

ユーザーが特定のポイントに触れてから指をドラッグすると、線が引かれることを望んでいます。

使用canvas.drawLine(_,_,_,_,_ );は線を引くことではありません。一度だけonDraw動作します。

私の主な質問は、「実行時に使用せずに線を引く方法onDraw()」です。

編集 :

public class DrawView  extends View {
    int radius=30;
    int initialX =0;
    int initialY=0;
    int finalX=0;
    int finalY=0;
    private Point currentPoint;
    private int index;
    static ArrayList<Point> pointListDrawView = new ArrayList<Point>();

    public DrawView(Context context, ArrayList<Point> pointList) {
        super(context);
        // TODO Auto-generated constructor stub
        this.setBackgroundColor(Color.WHITE);
        //pointListDrawView = pointList;


        pointListDrawView.add(pt(600,200));

        pointListDrawView.add(pt(500,200));
        pointListDrawView.add(pt(400,200));
        pointListDrawView.add(pt(400,300));

        pointListDrawView.add(pt(400,400));
        pointListDrawView.add(pt(500,400));
        pointListDrawView.add(pt(400,400));

        pointListDrawView.add(pt(400,500));
        pointListDrawView.add(pt(400,600));
        pointListDrawView.add(pt(500,600));
        pointListDrawView.add(pt(600,600));

    }
    private Point pt(int i, int j) {
        // TODO Auto-generated method stub
        Point P = new Point(i, j);
        return P ;
    }
    Paint paint= new Paint();
    Canvas universalCanvas;
    @Override 
    protected void onDraw(final Canvas canvas) {

            paint.setColor(Color.GREEN);
            paint.setStrokeWidth(10);
            for(int i=0; i<pointListDrawView.size();i++){
            canvas.drawCircle(pointListDrawView.get(i).x, pointListDrawView.get(i).y, 15, paint);
            }
            universalCanvas = canvas;
    //      drawLines(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub

        int i =0;

        switch (event.getAction()){

        case MotionEvent.ACTION_DOWN:
                if(((event.getX()>pointListDrawView.get(i).x-radius) && (event.getX()<pointListDrawView.get(i).x+radius) && (event.getY()>pointListDrawView.get(i).y-radius) && (event.getY()<pointListDrawView.get(i).y+radius)))

                {
                    Log.d("touch", "touched correct point");
                    initialX=pointListDrawView.get(i).x;
                    initialY=pointListDrawView.get(i).y;

                } 

                else{
                    Log.d("touch", "touch discarded");
                return false;
                }
        break;

        case MotionEvent.ACTION_MOVE:
                universalCanvas.drawLine(initialX, initialY, event.getX(), event.getY(), paint);

                break;

        case MotionEvent.ACTION_UP:
                if(((event.getX()>pointListDrawView.get(i+1).x-radius) && (event.getX()<pointListDrawView.get(i+1).x+radius) && (event.getY()>pointListDrawView.get(i+1).y-radius) && (event.getY()<pointListDrawView.get(i+1).y+radius)))
                {
                    finalX=pointListDrawView.get(i+1).x;
                    finalY=pointListDrawView.get(i+1).y;
                    universalCanvas.drawLine(initialX,initialY, finalX,finalY, paint);
                    Log.d("touch", "line drawn");
                    return true;
                }
                else
                {
                    Log.d("touch", "correct point touched and discarded");
                    return false;
                }


        default:
            break;

        }
        invalidate();
        return true;

    }

}
4

2 に答える 2

8

私はあなたのためにこのコードを書くだけです。それが役立つかどうかを確認してください。

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.PointF;
import android.view.MotionEvent;
import android.view.View;

public class TestView extends View
{

    private Paint paint;
    private PointF startPoint, endPoint;
    private boolean isDrawing;

    public TestView(Context context)
    {
        super(context);
        init();
    }

    private void init()
    {
        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Style.STROKE);
        paint.setStrokeWidth(2);
        paint.setAntiAlias(true);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        if(isDrawing)
        {
            canvas.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y, paint);
        }
    }


    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                startPoint = new PointF(event.getX(), event.getY());
                endPoint = new PointF();
                isDrawing = true;
                break;
            case MotionEvent.ACTION_MOVE:
                if(isDrawing)
                {
                    endPoint.x = event.getX();
                    endPoint.y = event.getY();
                    invalidate();
                }
                break;
            case MotionEvent.ACTION_UP:
                if(isDrawing)
                {
                    endPoint.x = event.getX();
                    endPoint.y = event.getY();
                    isDrawing = false;
                    invalidate();
                }
                break;
            default:
                break;
        }
        return true;
    }
}
于 2012-05-28T08:01:57.707 に答える
0

2つの解決策があります:

  1. 悪くて簡単(これはあなたの質問に対する答えです:「onDraw()を使用せずに実行時に線を描く方法は?」)-ImageViewをサブクラス化し、ビットマップで描画してからImageViewを更新します
  2. 良いとより多くの作業で-onTouchEventにタッチの履歴を保存しないでください。つまり、すべてのACTION_DOWN ACTION_MOVEを保存します(マルチタッチについて覚えているので、タッチのIDをACTION_DOWNに保存し、ACTION_MOVE / ACTION_UPで確認します)!DOWNUPとMOVEの場合にのみinvalidateを呼び出します。onDrawメソッドで、この履歴を描画します。編集では、あなたは良い一歩を踏み出しましたが、そこで絵を描きました。
于 2012-05-28T07:54:07.883 に答える