android - 如何在运行时在自定义 View 中画线?

标签 android line draw

我正在尝试使用触摸方法画一条线。

我希望当用户触摸特定点然后拖动手指时,应该绘制线。

使用 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;

    }

}

最佳答案

我只是为您编写这段代码。检查它是否有帮助。

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;
    }
}

关于android - 如何在运行时在自定义 View 中画线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10780777/

相关文章:

java - 在 Java GUI 中暂停执行

javascript - Node js 控制台写入百分比

matlab - 在 matlab 中绘制一堆 3d 线的最有效方法

IOS UIImage 图片颠倒

ipython - 如何制作 iPython/Jupyter 中内联的 NLTK draw() 树

Android(2.1+)根据上一个 Activity 发送的属性为 Activity 加载不同的布局

android - 如何设置android :width to 0dp in code?

java - 由于 setSelection(),EditText 中的文本删除停止

objective-c - 查找点靠近线并且位于线的端点之间

javascript - 在 Javascript 处理中的其他函数中创建一个 draw() 函数