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

    作用:   

    ViewDragHelper并不是直接作用于要被拖动的View,而是使其控制的视图容器中的子View可以被拖动,如果要指定某个子view的行为,需要在Callback中想办法;

    使用步骤(实现侧滑栏):

    1、将ViewGroup中的点击事件都交给ViewDragHelper

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return mViewDragHelper.shouldInterceptTouchEvent(ev);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mViewDragHelper.processTouchEvent(event);
        return true;
    }
    传递点击事件

    2、重写ViewDragHelper.Callback,事件的回调都在Callback处理

       private ViewDragHelper.Callback mCallback = new ViewDragHelper.Callback() {
            @Override
            //当松手的时候回调该方法
            public void onViewReleased(View releasedChild, float xvel, float yvel) {
                super.onViewReleased(releasedChild, xvel, yvel);
    //mLinearMain.getLeft()的效果竟然与mLinearMain.getScrollX()一样
                if (mLinearMain.getLeft() < 100){
                   //弹性滑动到0,0点 mViewDragHelper.smoothSlideViewTo(mLinearMain,0,0);
                }
                else {
                     //弹性滑动到300,0点 mViewDragHelper.smoothSlideViewTo(mLinearMain,300,0);
                }
                Log.d(TAG,mLinearMain.getX()+"");
              ViewCompat.postInvalidateOnAnimation(SliderFrameLayout.this);
            }
          //是否让所点击的View移动
           @Override
            public boolean tryCaptureView(View child, int pointerId) {
                boolean isMove = false;
                if (child == mLinearMain)
                    isMove = true;
                return isMove;
            }
          //横向移动  当然还有纵向移动的方法
            @Override
            public int clampViewPositionHorizontal(View child, int left, int dx) {
                return left;
            }
        };
    实现Callback

    3、因为mViewDragHelper.smoothSlideViewTo(mLinearMain,0,0);方法内部是实现了Scroller.startScroll()

    所以需要调用父View的computeScroll()方法

         @Override
         public void computeScroll() {
             super.computeScroll();
             if (mViewDragHelper.continueSettling(true)){
                 //ViewCompat用于版本兼容的
                 ViewCompat.postInvalidateOnAnimation(this);
             }
         }
    View Code

    4、创建ViewDragHelper

        public void initView(){
            mViewDragHelper = ViewDragHelper.create(this,mCallback);
        }
    创建View

    过程中产生的问题:

    1、为什么子View的getLeft()能够与getScrollX()得到是一样的

    2、RelativeLayout,无法实现子类超出其Width和Height。

    3、如何创建左侧滑栏的布局。查到的原理:创建HorizonSliderLayout,然后在onLayout()方法中使用scrollTo()创造的时候让侧滑栏先滑到左边去

    详解:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0911/1680.html

  • 相关阅读:
    bzoj 3438: 小M的作物
    bzoj 4445 [SCOI2015] 小凸想跑步
    hdu 4899 Hero meet devil
    hdu 4898 The Revenge of the Princess’ Knight
    【NOIP1999】拦截导弹
    【OpenJudge】2991:2011 题解
    【cqbzoj】1785:残缺棋盘上放车的方案数 --状压dp --输入毁一生
    【cqbzoj】:1330 Prime DP(Ahio2001 质数和分解)
    【Openjudge:Noi】7891:一元三次方程求解 c++
    【USACO FEB 2010 SILVER】吃巧克力(Chocolate Eating)
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5514642.html
Copyright © 2011-2022 走看看