zoukankan      html  css  js  c++  java
  • Android自定义View滑动事件处理总结

    滑动处理需要用到的各种工具类:


    android.view.VelocityTracker

    android.view.OverScroller

    android.view.ViewConfiguration

    VelocityTracker类 

    主要用跟踪触摸屏事件(flinging事件和其他gestures手势事件)的速率。

    用addMovement(MotionEvent)函数将Motion event加入到VelocityTracker类实例中。你可以使用getXVelocity() 或getXVelocity()获得横向和竖向的速率,但是使用它们之前请先调用computeCurrentVelocity(int units)来初始化速率的单位 。

    computeCurrentVelocity(int units, float maxVelocity)

    unitis表示速率的基本时间单位。unitis值为1的表示是,一毫秒时间单位内运动了多少个像素, unitis值为1000表示一秒(1000毫秒)时间单位内运动了多少个像素
    maxVelocity表示速率的最大值 
     
     1 @Override
     2     public boolean onTouchEvent(MotionEvent event) {
     3         // 获得允许执行一个fling手势动作的最大速度值
     4         int mMaximumVelocity = ViewConfiguration.get(context)
     5                 .getScaledMaximumFlingVelocity();
     6 
     7         // 实例化
     8         VelocityTracker mVelocityTracker = VelocityTracker.obtain();
     9         mVelocityTracker.addMovement(event);
    10         int action = event.getAction();
    11         float y = event.getY();
    12 
    13         switch (action) {
    14         case MotionEvent.ACTION_DOWN:
    15 
    16             return true;
    17         case MotionEvent.ACTION_MOVE:
    18 
    19             break;
    20         case MotionEvent.ACTION_CANCEL:
    21             // 回收
    22             mVelocityTracker.recycle();
    23 
    24             break;
    25         case MotionEvent.ACTION_UP:
    26             // 初始化速率的单位
    27             mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
    28             int velocityY = (int) mVelocityTracker.getYVelocity();
    29 
    30             // 回收
    31             mVelocityTracker.recycle();
    32 
    33             break;
    34         }
    35 
    36         return super.onTouchEvent(event);
    37     }

    OverScroller类

    是为了实现View平滑滚动的一个Helper类。它的作用就是辅助记录和计算我们滑动的距离和速度这些,用于自定义移动时帮我们处理掉数学的计算部分。

    1 OverScroller mScroller = new OverScroller(context);
    2 //滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间
    3 mScroller.startScroll(int startX, int startY, int dx, int dy) 
    4 //使用默认完成时间250ms
    5 mScroller.startScroll(int startX, int startY, int dx, int dy, int duration)
    6 //返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。
    7 mScroller.computeScrollOffset()

    设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动。

    ViewConfiguration类

    这个类主要定义了UI中所使用到的标准常量,像超时、尺寸、距离,如果我们需要得到这些常量的数据,我们就可以通过这个类来获取

    1  //获得触发移动事件的最短距离,如果小于这个距离就不触发移动控件
    2 int mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    3 //获得允许执行一个fling手势动作的最大速度值
    4 int mMaximumVelocity = ViewConfiguration.get(context).getScaledMaximumFlingVelocity();
    5 //获得允许执行一个fling手势动作的最小速度值
    6 int mMinimumVelocity = ViewConfiguration.get(context).getScaledMinimumFlingVelocity();

    如果布局控件以及其子控件的尺寸进行精确的控制那就要重写下面这个方法了

    onMeasure(int widthMeasureSpec, int heightMeasureSpec)

  • 相关阅读:
    Kubernetes1.91(K8s)安装部署过程(一)--证书安装
    开源仓库Harbor搭建及配置过程
    有关centos7 图形化root用户登录
    linux服务器查看tcp链接shell
    django表格form无法保存评论排查步骤
    Redis 4.x 安装及 发布/订阅实践和数据持久化设置
    django博客项目-设置django为中文语言
    windows 环境下如何使用virtualenv python环境管理工具
    【转载】python中利用smtplib发送邮件的3中方式 普通/ssl/tls
    php安装phpize工具
  • 原文地址:https://www.cnblogs.com/l2rf/p/5029615.html
Copyright © 2011-2022 走看看