我正在尝试使用触摸方法绘制一条线。
我希望当用户触摸特定点然后拖动手指时,应该绘制线条。
使用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;
}
}
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
有两种解决方案: