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

  • 相关阅读:
    聊下 git 使用前的一些注意事项
    .NET架构设计、框架设计系列文章总结
    聊下 git remote prune origin
    聊下git pull --rebase
    聊下git merge --squash
    git 命令使用总结
    聊下 git rebase -i
    ElasticSearch大数据分布式弹性搜索引擎使用
    DDD实施经验分享—价值导向、从上往下进行(圈内第一个吃螃蟹DDD实施方案)
    SaaS产品项目实施流程
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5514642.html
Copyright © 2011-2022 走看看