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周,有很多不清楚的地方,還請賜教

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM