Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to draw line during runtime in a custom view?

Tags:

android

draw

line

I am trying to draw a line using on touch method.

I want that when user touches a particular point and then drags the finger, the line should be drawn.

using canvas.drawLine(_,_,_,_,_ ); is not drawing lines. as onDraw works only once.

my main question is "how to draw a line during runtime without using onDraw()? "

edit :

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;

    }

}
like image 446
jeet.chanchawat Avatar asked Feb 20 '23 08:02

jeet.chanchawat


1 Answers

I just write this code for you. Check if it helps.

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;
    }
}
like image 78
Shaiful Avatar answered Mar 04 '23 10:03

Shaiful