TouchDelegate的用法


近期在学习Android的事件点击中发现了TouchDelegate,字面意思是"触摸委托",在进一步的了解中,发现在你想要扩大View的点击范围,但是不能改变布局的时候还是比较实用的。

如何使用

首先,来看下如何使用TouchDelegate。
如果你希望将子View的点击范围扩大到父View范围,你就可以使用TouchDelegate来做到。先看下示意图:
在这里插入图片描述
如图所示,子View的点击范围就是子View本身,但是我想要扩展点击事件到父View的范围,也就是蓝色的范围。那么我们就可以使用TouchDelegate。
代码:

	/**
     * 扩大View的触摸和点击响应范围,最大不超过其父View范围
     * 若想在一个父布局扩大多个View的点击区域,可以在view嵌套一个RelativeLayout或LinearLayout布局,这样就一个父布局对应一个View
     * 如果控件的位置有变化,那要在变化之后再调用此方法
     * @param view 需要扩大点击范围的View
     * @param left 点击区域的left
     * @param top 点击区域的top
     * @param right 点击区域的right
     * @param bottom 点击区域的bottom
     */
    public static void expandViewTouchDelegate(final View view,
                                               final int left, final int top,
                                               final int right, final int bottom) {

        ((View) view.getParent()).post(new Runnable() {
            @Override
            public void run() {
                Rect bounds = new Rect();
                view.setEnabled(true);
                view.getHitRect(bounds);

                bounds.top -= top;
                bounds.bottom += bottom;
                bounds.left -= left;
                bounds.right += right;
                TouchDelegate touchDelegate = new TouchDelegate(bounds, view);
                if (view.getParent() instanceof View) {
                    ((View) view.getParent()).setTouchDelegate(touchDelegate);
                }
            }
        });
    }

如果想要取消:

 	/**
     * 还原View的触摸和点击响应范围,最小不小于View自身范围
     *
     * @param view 需要扩大点击范围的View
     */
    public static void restoreViewTouchDelegate(final View view) {

        ((View) view.getParent()).post(new Runnable() {
            @Override
            public void run() {
                Rect bounds = new Rect();
                bounds.setEmpty();
                TouchDelegate touchDelegate = new TouchDelegate(bounds, view);

                if (view.getParent() instanceof View) {
                    ((View) view.getParent()).setTouchDelegate(touchDelegate);
                }
            }
        });
    }

采取此种方法的两点注意:

  1. 若View的自定义触摸范围超出Parent的大小,则超出的那部分无效。
  2. 一个Parent只能设置一个View的TouchDelegate,设置多个时只有最后设置的生效。

对于TouchDelegate的用法其实是非常简单的。由于一个父控件只能允许一个子View扩大触摸区域,设置多个时只有最后设置的生效。那么遇到多个子View的情况需要怎么解决呢?
通过查找资料,发现已经有大神解决了链接:浅谈TouchDelegate的坑与用法以及ListView Tips & Tricks #5: Enlarged Touchable Areas

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
如果你想扩大 Java 下拉框的点击范围,可以通过以下两种方式实现: 1. 使用自定义的下拉框控件 你可以在 Java 中使用自定义控件来实现下拉框,并在控件的外部增加一个透明的视图,从而扩大下拉框的点击范围。你可以在控件的构造函数中添加以下代码: ``` // 添加一个透明的视图 View view = new View(context); view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 点击透明视图时,隐藏下拉框 dismissDropDown(); } }); addView(view); ``` 在上面的代码中,我们创建了一个透明的视图,并将其添加到了下拉框控件的内部。当用户点击这个视图时,我们调用 `dismissDropDown()` 方法来隐藏下拉框。 2. 使用 TouchDelegate 类 另一种实现方式是使用 TouchDelegate 类来扩大下拉框的点击范围。你可以在下拉框控件的 onAttachedToWindow() 方法中添加以下代码: ``` // 获取下拉框控件的父布局 ViewGroup parent = (ViewGroup) getParent(); // 创建一个矩形,表示扩大后的点击范围 Rect rect = new Rect(); getHitRect(rect); rect.top -= 20; // 向上扩大 20 像素 rect.bottom += 20; // 向下扩大 20 像素 rect.left -= 20; // 向左扩大 20 像素 rect.right += 20; // 向右扩大 20 像素 // 创建一个 TouchDelegate 对象,并设置到父布局中 parent.setTouchDelegate(new TouchDelegate(rect, this)); ``` 在上面的代码中,我们创建了一个矩形,表示扩大后的点击范围,并使用 TouchDelegate 类将这个矩形设置到了下拉框控件的父布局中。这样,当用户点击下拉框控件的周围区域时,实际上是点击了扩大后的矩形区域,从而达到扩大点击范围的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rockyou666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值