view基础知识介绍(一)

view基础知识介绍

  • view是一种界面层的控件的一种抽象 分为view和viewGroup viewGroup继承自view 也就是说view本身可以是单个控件 也可以是一个控件组 例如:一个view中可以包含view和viewGroup viewGroup中又可以包括view和viewGroup 以此类推

  • view的位置参数
    1. view的位置主要由四个参数决定 left right top bottom 其中left为view的左侧横坐标 right为view右侧横坐标 top为view上边纵坐标 bottom为view下边纵坐标 这些坐标的位置都是相对坐标 相对于view的父控件而言 那么 view的width=right-left height=bottom-top 同时 这四个参数android也提供了对应的get方法
    2. 此外 还有x y translateX translateY x和y表示view左上角的坐标 translateX和translateY表示view左上角相对于父控件的偏移量 默认值为0 其中x=left+translateX y=top+translateY view在平移过程中left和top是不会发生改变的 改变的是x y translateX和translateY这四个参数。

  • MotionEvent(动作事件)

    1. 指手指在解除屏幕之后的一系列事件 其中典型的事件类型有 ACTION_DOWN 手指刚接触屏幕 ACTION_MOVE 手指在屏幕上移动 ACTION_UP 手指从屏幕上松开的一瞬间 例如:单击事件有ACTION_DOWN和ACTION_UP组成 滑动事件由一个ACTION_DOWN 多个ACTION_MOVE 和一个ACTION_UP组成 通过MotionEvent对象我们还可以获取到该事件发生时的x和y坐标 系统提供了两组方法

      getX/getY getRawX/getRawY
      

      前一组方法获取的是相对于该view的坐标 后一组方法获取的是相对于屏幕左上角的坐标

    2. TouchSlop
      指的是能够被系统识别的最小的滑动距离 也就是说 当手指在屏幕上滑动的距离小于这个距离时 系统不认为你是在进行滑动操作 这是一个常量 和设备有关 可以通过以下方法获得

      ViewConfiguration.get(getContext()).getScaledTouchSlop()
      

      我们可以利用这个常量做一些相对应的过滤操作

    3. VelocityTracker 速度追踪
      用于跟踪手指在滑动过程中的速度 包括水平和竖直方向的速度 使用方式如下

      VeloCityTracker velocityTracker = VeloCityTracker.obtain();
      velocityTracker.addMotionEvent(event);
      
      velocityTracker.computeCurrentVelocity(1000); //参数值为测量的时间
      int xVelocity = velocityTracker.getXVelocity();
      int yVelocity = velocityTracker.getYVelocity();
      
      velocityTracker.clear();
      velocityTracker.recycle();//当不需要计算时 需要调用这两个方法来重置并回收内存
      

      需要注意的是 在获取速度之前必须先指定计算时间 同时 获取的速度为指定时间内手指划过的像素值

    4. GestrueDetector 手势检测
      用于辅助检测用户的单击 滑动 长按 双击等行为 使用方法如下

      GestrueDector mGestrueDetector = new GestrueDetector(this);
      //解决长按屏幕后无法滑动的现象
      mGestrueDetector.setIsLongpressEnable(false);
      
      //接管view的onTouchEvent方法 在onTouchEvent中添加如下实现
      boolean consume = mGestrueDetector.onTouchEvent(event);
      return consume;
      

      具体例子如下:

      /**
       * 用以说明GestrueDetector(手势检测)的详细用法的说明
       */
      public class GestrueDetectorView extends View implements GestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener{
      
          //我们在该类中实现了onGesrueListener和onDoubleTopListener 并构建了GestrueDetector对象
          private final GestureDetector mGestureDetector = new GestureDetector(this);
      
          public GestrueDetectorView(Context context) {
              super(context);
      
          }
      
          /**
           * 在veiw的onTouchEvent方法中 用GestrueDetector的onTouchEvent方法来接管view的事件处理 并返回对应结果
           * @param event
           * @return
           */
          @Override
          public boolean onTouchEvent(MotionEvent event) {
              boolean consume = mGestureDetector.onTouchEvent(event);
              return consume;
          }
      
          //以下三个方法的触发顺序:onDown->onShowPress->onLongPress
      
          /**
           * 属于onGestrueListener接口 该方法由一个ACTION_DOWN触发
           *
           * 用户按下屏幕就会触发
           * @param e
           * @return
           */
          @Override
          public boolean onDown(MotionEvent e) {
              return false;
          }
      
          /**
           * 属于onGestrueListener接口 该方法由一个ACTION_DOWN触发 不同的是 该方法强调的是尚未松开或者拖动状态
           *
           * 如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行
           * @param e
           */
          @Override
          public void onShowPress(MotionEvent e) {
      
          }
      
          /**
           * 属于onGestrueListener接口 该方法由一个ACTION_UP触发 单击行为
           *
           * 触发顺序:
           * 点击一下非常快的(不滑动)Touchup:
           * onDown->onSingleTapUp->onSingleTapConfirmed
           * 点击一下稍微慢点的(不滑动)Touchup:
           * onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
           *
           * @param e
           * @return
           */
          @Override
          public boolean onSingleTapUp(MotionEvent e) {
              return false;
          }
      
          /**
           * 属于onGestrueListener接口 该方法由一个ACTION_DOWN和多个ACTION_MOVE触发 指拖动行为 手指还没有离开屏幕
           *
           * 在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法       在ACTION_MOVE动作发生时就会触发
           * 滑屏:手指触动屏幕后,稍微滑动后立即松开
           * onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
           * 拖动
           * onDown------》onScroll----》onScroll------》onFiling
           *
           * @param e1 ACTION_DOWN的MotionEvent
           * @param e2 最后一次ACTION_MOVE的MotionEvent
           * @param distanceX 相对于上次调用该方法时所滑动的x坐标距离
           * @param distanceY 相对于上次调用该方法时所滑动的y坐标距离
           * @return
           */
          @Override
          public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
              return false;
          }
      
          /**
           * 属于onGestrueListener接口 用户长按屏幕时触发该方法
           *
           * 长按触摸屏,超过一定时长,就会触发这个事件
           * @param e
           */
          @Override
          public void onLongPress(MotionEvent e) {
      
          }
      
          /**
           * 属于onGestrueListener接口 该方法由一个ACTION_DOWN和多个ACTION_MOVE以及一个ACTION_UP调用
           * 属于快速滑动操作
           *
           * 滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
           *
           * @param e1 第1个ACTION_DOWN MotionEvent
           * @param e2 最后一个ACTION_MOVE MotionEvent
           * @param velocityX X轴上的移动速度,像素/秒
           * @param velocityY Y轴上的移动速度,像素/秒
           * @return
           */
          @Override
          public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
              return false;
          }
      
          /**
           * 属于onDoubleTapListener接口 该方法区别于onSingleTapUp 该方法是一个严格的单击行为 如果触发了该方法 那么只能是一个单击
           * 而不可能是双击中的一次单击
           * 当用户执行单机操作时 系统会首先执行onDown onSingleTapUp 然后在等待一段时间之后
           * 确定该次点击不是双击操作之后 执行该方法
           * @param e
           * @return
           */
          @Override
          public boolean onSingleTapConfirmed(MotionEvent e) {
              return false;
          }
      
          /**
           * 属于onDoubleTapListener接口 在触发onDown onSingleTapUp方法之后 再次点击会触发该方法
           *
           * 在第二下点击时,先触发OnDoubleTap,然后再触发OnDown(第二次点击)
           * 其次在触发OnDoubleTap以后,就开始触发onDoubleTapEvent了
           *
           * @param e
           * @return
           */
          @Override
          public boolean onDoubleTap(MotionEvent e) {
              return false;
          }
      
          /**
           * 属于onDoubleTapListener接口 该方法会在onDoubleTap方法之后被触发 包括双击之间的按下 滑动和抬起等操作
           * @param e
           * @return
           */
          @Override
          public boolean onDoubleTapEvent(MotionEvent e) {
              return false;
          }
      }
      

参考资料:Android开发艺术探索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值