zoukankan      html  css  js  c++  java
  • 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周,有很多不清楚的地方,还请赐教

     

  • 相关阅读:
    python高级(2)—— 基础回顾2
    Java System Reports
    EWA不能及时通过邮件接收
    LA服务可用性4个9是什么意思?怎么达到?
    安装HANA Rules Framework(HRF)
    RFC destination fails with error Incomplete Logon Data after system copy
    为满足中国税改,SAP该如何打SPS
    HANA数据库无法停止
    SR开启时LOG_MODE必须是normal
    2743711
  • 原文地址:https://www.cnblogs.com/hao-dotnet/p/3269149.html
Copyright © 2011-2022 走看看