zoukankan      html  css  js  c++  java
  • ViewDragHelper类的基本使用

         在android的开发包android.support.v4.widget中有一个ViewDragHelper类。这个类的作用是帮助我们处理View的拖拽滑动。在一个ViewGroup类的内部定义一个ViewDragHelper,并且把onInterceptTouchEvent()和onTouchEvent()事件交给这个类去处理,这样也就免去了烦琐的事件处理判断。

      1.创建实例

    1 public static ViewDragHelper create (ViewGroup forParent, float sensitivity, ViewDragHelper.Callback cb)

      ViewDragHelper提供了这个静态方法来创建一个实例。forParent表示当前的ViewGroup,ViewDragHelper一般定义在ViewGroup中,这样这个参数也就this。 sensitivity表示敏感度,值越大越敏感,越能快速的检测到滑动,默认的正常值是1.0f。ViewDragHelper.Callback这个抽象类是核心的部分,在这个类中定义了所有的事件的处理。

    2.状态

      STATE_DRAGGING:  view正处在被拖动的状态

      STATE_IDLE: view没有被拖动或者动画已经结束的状态

      STATE_SETTLING:指定了view的确定位置的时候,view处于这种状态

    下面用一个例子来演示这个类的使用:

      1 package com.example.ubuntu.viewdragermotion;
      2 
      3 import android.content.Context;
      4 import android.support.v4.view.MotionEventCompat;
      5 import android.support.v4.widget.ViewDragHelper;
      6 import android.util.AttributeSet;
      7 import android.view.MotionEvent;
      8 import android.view.View;
      9 import android.view.ViewGroup;
     10 import android.widget.LinearLayout;
     11 
     12 /**
     13  * Created by ubuntu on 15-12-1.
     14  */
     15 public class DragerMotionLayout extends LinearLayout {
     16     private View mChild_01;
     17     private ViewDragHelper mDragHelper = null;
     18     //设置ViewDragHelper的回调方法
     19     private ViewDragHelper.Callback mCallBack = new ViewDragHelper.Callback() {
     20         @Override
     21         public boolean tryCaptureView(View child, int pointerId) {
     22             //捕获view,被捕获之后,可以跟随手指的操作
     23             return child == mChild_01;
     24         }
     25 
     26         @Override
     27         public int clampViewPositionHorizontal(View child, int left, int dx) {
     28             //当用手拖动view的时候,设置view的水平方向上滑动距离
     29             final int leftPadding = child.getPaddingLeft();
     30             final int rightPadding = ((ViewGroup) child.getParent()).getWidth() - child.getWidth();
     31             return Math.min(rightPadding, Math.max(left, leftPadding));
     32         }
     33 
     34         @Override
     35         public int clampViewPositionVertical(View child, int top, int dy) {
     36             //当用手拖动view的时候,设置view的垂直方向上滑动距离
     37             final int topPadding = child.getPaddingTop();
     38             final int bottomPadding = ((ViewGroup) child.getParent()).getHeight() - child.getHeight();
     39             return Math.min(bottomPadding, Math.max(top,topPadding));
     40         }
     41 
     42         @Override
     43         public void onEdgeDragStarted(int edgeFlags, int pointerId) {
     44             //边缘滑动的时候,捕获view
     45             mDragHelper.captureChildView(mChild_01, pointerId);
     46         }
     47 
     48         @Override
     49         public void onViewReleased(View releasedChild, float xvel, float yvel) {
     50             //设置当手指离开的时候,view应该设置的位置,调用这个方法的时候,必须保证
     51             //computeScroll()方法中使用的是ViewDragHelper.continueSettling(true)方法接管
     52             mDragHelper.settleCapturedViewAt(0,0);
     53             invalidate();
     54         }
     55     };
     56 
     57     public DragerMotionLayout(Context context) {
     58         this(context, null);
     59     }
     60 
     61     public DragerMotionLayout(Context context, AttributeSet attrs) {
     62         this(context, attrs, 0);
     63     }
     64 
     65     public DragerMotionLayout(Context context, AttributeSet attrs, int defStyleAttr) {
     66         super(context, attrs, defStyleAttr);
     67         init();
     68     }
     69 
     70     @Override
     71     protected void onFinishInflate() {
     72         super.onFinishInflate();
     73         mChild_01 = this.getChildAt(0);
     74     }
     75 
     76     private void init() {
     77         //初始化ViewDragHelper
     78         mDragHelper = ViewDragHelper.create(this, 1.0f, mCallBack);
     79         //使监听左边的边缘滑动
     80         mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
     81     }
     82 
     83     @Override
     84     public boolean onInterceptTouchEvent(MotionEvent ev) {
     85         int action = MotionEventCompat.getActionMasked(ev);
     86         if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
     87             mDragHelper.cancel();
     88             return false;
     89         }
     90         //ViewDragHelper接管事件的拦截
     91         return mDragHelper.shouldInterceptTouchEvent(ev);
     92     }
     93 
     94 
     95     @Override
     96     public boolean onTouchEvent(MotionEvent event) {
     97         //ViewDragHelper接管事件的处理
     98         mDragHelper.processTouchEvent(event);
     99         return true;
    100     }
    101 
    102     @Override
    103     public void computeScroll() {
    104         //如果view处于STATE_SETTLING状态下,使用该方法接管
    105         if(mDragHelper.continueSettling(true)){
    106             invalidate();
    107         }
    108     }
    109 }
  • 相关阅读:
    结构型模式上
    创建型模式下
    创建型模式中
    创建型模式上
    设计模式总述
    Java中事件机制
    UI常用控件
    UITextField和UIViewConteoller
    UIScrollView 和 UIPageControl
    分栏视图控制器
  • 原文地址:https://www.cnblogs.com/summerpxy/p/5013412.html
Copyright © 2011-2022 走看看