我实现的思路:
1.继承ImageView类
2.重写onTouchEvent方法,在ACTION_MOVE(即移动时),记录下所经过的点坐标,在ACTION_UP时(即手指离开时,这时一条线已经画完),将所画的线(点的集合)保存在一个集合中
3.重写onDraw方法,利用canvas和所记录下的线和点画出线来
可能我讲的十分笼统,下面来看看实际的代码吧
代码语言:javascript复制//代表ImageView上的一点
public class ViewPoint
{
float x;
float y;
}
//表示一条线
public class Line
{
ArrayList<ViewPoint points = new ArrayList<ViewPoint ();
}
如上所示,ViewPoint表示一点,而Line表示一条线
然后在扩展的ImageView类上声明如下:
代码语言:javascript复制public class HandWritingImageView extends ImageView
{
private Paint paint;
//当前正在画的线
private Line current = new Line();
//所有画过的线
private ArrayList<Line lines = new ArrayList<Line ();
}
随后重写onTouchEvent方法
代码语言:javascript复制@Override
public boolean onTouchEvent(MotionEvent event)
{
//获取坐标
clickX = event.getX();
clickY = event.getY();
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
invalidate();
return true;
}
else if (event.getAction() == MotionEvent.ACTION_MOVE)
{
ViewPoint point = new ViewPoint();
point.x = clickX;
point.y = clickY;
//在移动时添加所经过的点
current.points.add(point);
invalidate();
return true;
}
else if (event.getAction() == MotionEvent.ACTION_UP)
{
//添加画过的线
lines.add(current);
current = new Line();
invalidate();
}
return super.onTouchEvent(event);
}
可以看到当我们手指移动时,获取保存所经过的点并调用invalidate方法进行屏幕刷新(可以使onDraw方法被调用,稍后可以看到),当我们手指离开时添加之前的所画的线到集合中,并调用invalidate方法
接下来看看所重写的onDraw方法,它利用所保存的线的信息进行画线
代码语言:javascript复制@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
//画出之前所有的线
for (int i = 0; i < lineData.lines.size(); i )
{
drawLine(canvas, lines.get(i));
}
//画出当前的线
drawLine(canvas, current);
}
private void drawLine(Canvas canvas, Line line)
{
for (int i = 0; i < line.points.size() - 1; i )
{
float x = line.points.get(i).x;
float y = line.points.get(i).y;
float nextX = line.points.get(i 1).x;
float nextY = line.points.get(i 1).y;
canvas.drawLine(x, y, nextX, nextY, paint);
}
}
这样就可以在ImageView上随意涂鸦了,并且还可以通过删除lines中的最后条line来实现撤销功能。
以上这篇android中实现在ImageView上随意画线涂鸦的方法就是小编分享给大家的全部内容了,希望能给大家一个参考。