• android 学习之ViewDragHelper


    ViewDragHelper是用来移动ViewGroup中子View的,之前写View的移动都是通过scrollTo来实现,但是它移动的是VIew中的内容,ViewGroup中的所有的子View都会移动,我一直在找能够移动子View的方法。在Google的IO大会上,发布的DrawerLayout和SlidingPaneLayout,其内部实现都是使用的ViewDragHelper实现的。
     
    首先使用方法:
    1.ViewDragHelper不能被new出来,是通过
       private void init(Context context){
            mDragHelper = ViewDragHelper.create(this, 0.2f, new DragHelperCallback());

     }

    创建出来的。
     
    2.在ViewGroup中的打断触摸事件的方法中:由ViewDragHelper自己来判断是否去打断触摸事件。
      
    @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
          if (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP) {
              mDragHelper.cancel();
              return false;
          }
          return mDragHelper.shouldInterceptTouchEvent(ev);
        }  
     
    3. 在ViewGroup的触摸事件中:
     @Override
        public boolean onTouchEvent(MotionEvent ev) {
          mDragHelper.processTouchEvent(ev);
          return true;
        }
    4.整个手势的识别通过ViewDragHelper自己完成,然后自己回调自己的接口,通过接口来完成相应的动作:
    class DragHelperCallback extends Callback{
     
            @Override
            public boolean tryCaptureView(View arg0, int arg1) {
                System.out.println("positionID=="+arg1);
                return arg0 == getTopView();
            }
            
            @Override
            public int clampViewPositionHorizontal(View child, int left, int dx) {
                 final int leftBound = getPaddingLeft();
                 final int rightBound = getWidth() - getTopView().getWidth();
                 final int newLeft = Math.min(Math.max(left, leftBound), rightBound);
                 return newLeft;
            }
            
             @Override
                public int clampViewPositionVertical(View child, int top, int dy) {
                        final int topBound = getPaddingTop();
                        final int bottomBound = getHeight() - getTopView().getHeight();
                        final int newTop = Math.min(Math.max(top, topBound), bottomBound);
                        return newTop;
                }
              
        } 
     
    private View getTopView(){
            return getChildAt(1);
        }
        
        private View getBottomView(){
            return getChildAt(0);
        }  
     
    这里处理的是左右滑动的事件。
     
    简单的使用就是这样的。先上一下Demo的效果图:
     
     
     
     
    ViewDragHelper封装了手势,大大的简化了很多的手势处理。
    我参照别人的博客和Demo,自己实现了相同的效果,在下一篇博客中,放出源码。边学边练。
     
     
     
     
     
     
     
    我的github地址:https://github.com/flyme2012
    我的博客地址:http://www.cnblogs.com/flyme2012/
  • 相关阅读:
    An internal error occurred during: "Launching MVC on Tomcat 6.x". java.lang.NullPointerException
    bat批处理文件夹内文件名的提取
    人脸识别-常用的人脸数据库
    WPF RichTextBox 做内容展示框 滚动条控制判定是否阅读完成
    WPF+通过配置文件生成菜单(Menu)+源码
    程序员也可以浪漫----倾情奉献一份你值得拥有的浪漫网站源码(情人节快来了~)
    这世界唯一的你:最美程序媛走红网络
    20分钟读懂程序集
    简介4种同步方法的实现
    共享文件夹:The user has not been granted the requested logon type at this computer
  • 原文地址:https://www.cnblogs.com/flyme2012/p/4075460.html
Copyright © 2020-2023  润新知