安卓开发之ViewDragHelper的使用及自定义可下拉展示内容的ViewGroup

一、ViewDragHelper

一个自定义ViewGroup的工具类,它提供了许多有用的方法和状态允许用户去拖拽和绘制子View在自定义ViewGroup中的轨迹和位置。

  1. ViewDragHelper可以使用静态方法创建一个实例:

    ViewDragHelper.create(ViewGroup forParent,int sensitiveity,ViewDragHelper.Callback cb)
    
  2. 在自定义ViewGroup中,ViewDragHelper可以帮助我们来分析手势和处理拖动:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
            try {
            //处理触摸事件
            mDragHelper.processTouchEvent(event);
            } catch (Exception e) {
            e.printStackTrace();
            }
            //返回true,
            return true;
    }
    
  3. 使用ViewDragHelper来动态移动自定义ViewGroup中的控件:

    public boolean smoothSlideViewTo(View child, int finalLeft, int finalTop)
    
    // Animate the view child to the given (left, top) position.
    // 返回true 代表还没有移动到指定的位置,需要刷新界面,继续移动
    // 返回false 就停止工作
    
  4. 使用ViewDragHelper滑动边缘监听:

    // 监听左边缘滑动
    setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
    

二、 ViewDragHelper.Callback

ViewDragHelper.Callback集成了许多可覆写的方法,所有移动的控制在ViewDragHelper.Callback里面来实现。

  1. 是否可以捕捉ViewGroup中的子组件:

    public boolean tryCaptureView(View child, int pointerId) {
    
    //返回true,就代表着可对该子组件处理滑动事件。否则就不会处理。 
    
    return true;
    //只对特定的组件捕捉 return speChild == child;
    
    }
    

    // 使用ViewDragHelper的captureChildView捕捉子组件,该方法可以绕过tryCaptureView方法

  2. clampViewPositionHorizontal[Vertical]:

    处理子组件在水平或者竖直方向的滑动限制,在这个方法内部做子组件的边界处理,就是确保子组件不会滑过界。

    例如在竖直方向进行滑动时,一般先获取控件可滑动到的顶端Y值底端Y值,再进行一个取值

    @Override
    public int clampViewPositionVertical(View child, int top, int dy) {
    
    //手指触摸移动时实时回调, top表示要到的y位置
    
        int topBound = ...;
        int bottomBound = ...;
        return Math.min(Math.max(topBound, top), bottomBound);
    
    }
    
  3. onViewPositionChanged
    当前拖动的子组件位置变化时调用的方法。一般在该方法里调整其他子组件的位置。

    @Override
    public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
    
        //changedV
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DragLinearLayout是一个LinearLayout, 他可是其子View在其范围内可拖动、可交换位置。默认情况下,子View是不可拖动的,你需要调用DragLinearLayout.setViewDraggable(child, child)方法让其可拖动。项目地址:https://github.com/justasm/DragLinearLayout 效果图:如何使用使用LinearLayout一样:                        2. 让子View可拖动默认情况下子View是不可拖动的,你需要调用dragLinearLayout.setViewDraggable()让子View变为可拖动的。DragLinearLayout dragLinearLayout = (DragLinearLayout) findViewById(R.id.container); //让子view可拖动,默认是不能拖动的         for(int i = 1; i < dragLinearLayout.getChildCount(); i ){             View child = dragLinearLayout.getChildAt(i);             dragLinearLayout.setViewDraggable(child, child);          }可以动态添加可拖动子viewfinal View view = View.inflate(context, R.layout.view_layout, null); dragLinearLayout.addDragView(viewview.findViewById(R.id.view_drag_handle));   // ..   dragLinearLayout.removeDragView(view);使用OnViewSwapListener检测子view之间的排序变化事件:dragLinearLayout.setOnViewSwapListener(new DragLinearLayout.OnViewSwapListener() {     @Override     public void onSwap(View firstView, int firstPosition,             View secondView, int secondPosition) {         // update data, etc..     } });当在ScrollView使用DragLinearLayout的时候,如果你想在拖拽的时候ScrollView也能滚动,需要调用setContainerScrollView(Scroll

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值