android中实现在ImageView上随意画线涂鸦

我实现的思路:

1.继承ImageView类

2.重写onTouchEvent方法,在ACTION_MOVE(即移动时),记录下所经过的点坐标,在ACTION_UP时(即手指离开时,这时一条线已经画完),将所画的线(点的集合)保存在一个集合中

3.重写onDraw方法,利用canvas和所记录下的线和点画出线来

 

可能我讲的十分笼统,下面来看看实际的代码吧

//代表ImageView上的一点
public class ViewPoint
{
  float x;
  float y;
}

//表示一条线
public class Line
{
  ArrayList<ViewPoint> points = new ArrayList<ViewPoint>();      
}

如上所示,ViewPoint表示一点,而Line表示一条线

然后在扩展的ImageView类上声明如下:

public class HandWritingImageView extends ImageView
{
  private Paint paint;

  //当前正在画的线
  private Line current = new Line(); //所有画过的线   private ArrayList<Line> lines = new ArrayList<Line>(); }

 随后重写onTouchEvent方法

    @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方法,它利用所保存的线的信息进行画线

    @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才3周,有很多不清楚的地方,还请赐教

 

posted @ 2013-08-19 23:14  浩GE  阅读(7378)  评论(1编辑  收藏  举报