Android ViewDragHelper完全解析 自定义ViewGroup神器

本文详细介绍了如何使用ViewDragHelper实现自定义ViewGroup的拖动功能,包括触摸事件处理、ViewDragHelper.Callback方法的定制,以及边界检测、移动限制等功能的应用。
摘要由CSDN通过智能技术生成

可见传入越大,mTouchSlop的值就会越小。第三个参数就是Callback,在用户的触摸过程中会回调相关方法,后面会细说。

2、触摸相关方法

/**

  • 判断事件是否进行拦截

  • @param ev

  • @return

*/

@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

return mDragger.shouldInterceptTouchEvent(ev);

}

/**

  • 拦截之后进行处理

  • @param event

  • @return

*/

@Override

public boolean onTouchEvent(MotionEvent event) {

mDragger.processTouchEvent(event);

return true;

}

onInterceptTouchEvent中通过使用mDragger.shouldInterceptTouchEvent(event)来决定我们是否应该拦截当前的事件。onTouchEvent中通过mDragger.processTouchEvent(event)处理事件。

3、实现ViewDragHelper.CallCack相关方法

new ViewDragHelper.Callback()

{

@Override

public boolean tryCaptureView(View child, int pointerId)

{

return true;

}

@Override

public int clampViewPositionHorizontal(View child, int left, int dx)

{

return left;

}

@Override

public int clampViewPositionVertical(View child, int top, int dy)

{

return top;

}

}

ViewDragHelper中拦截和处理事件时,需要会回调CallBack中的很多方法来决定一些事,比如:哪些子View可以移动、对个移动的View的边界的控制等等。

上面复写的3个方法:

tryCaptureView如何返回ture则表示可以捕获该view,你可以根据传入的第一个view参数决定哪些可以捕获

clampViewPositionHorizontal,clampViewPositionVertical可以在该方法中对child移动的边界进行控制,left , top 分别为即将移动到的位置,比如横向的情况下,我希望只在ViewGroup的内部移动。

即:最小>=paddingleft,最大<=ViewGroup.getWidth()-paddingright-child.getWidth。就可以按照如下代码编写:

@Override

public int clampViewPositionHorizontal(View child, int left, int dx)

{

final int leftBound = getPaddingLeft();

final int rightBound = getWidth() - mDragView.getWidth() - leftBound;

final int newLeft = Math.min(Math.max(left, leftBound), rightBound);

return newLeft;

}

经过上述3个步骤,我们就完成了一个简单的自定义ViewGroup,可以自由的拖动子View。

(二)布局文件

<?xml version="1.0" encoding="utf-8"?>

<com.zhjy.hxf.hzviewgroup.view.VDHLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”>

<TextView

android:layout_width=“100dp”

android:layout_height=“100dp”

android:layout_gravity=“center”

android:layout_margin=“10dp”

android:background=“#44ff0000”

android:gravity=“center”

android:text=“I can be dragged !” />

<TextView

android:layout_width=“100dp”

android:layout_he

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值