热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android使用TouchDelegate增加View的触摸范围

这篇文章主要为大家详细介绍了Android使用TouchDelegate增加View的触摸范围,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文为大家分享了Android使用TouchDelegate增加View触摸范围的方法,供大家参考,具体内容如下

还不知道TouchDelegate这个东西的可以先看一下API,这里大致说一下它的作用:假设有两个View,分别是v1,v2,我们可以通过v1的setTouchDelegate(bounds, v2)来委派触摸事件,其中bounds是一个Rect。v1中,落在这个范围的TouchEvent都会传给v2。

既然是这样,那我们可以通过设置某个view的parent的touchDelegate来达到扩大这个view触摸范围的目的。关键是什么时候去执行parent.setTouchDelegate()方法呢?要设置这个委派,必须得知道当前view大小以及它在parent的位置。而这些数据都是在onLayout才能确定(注:如果不是自定义View,只是在Activity中设置,请将这些操作置于onWindowFocusChanged()方法中)。至此,实现的思路已经很清晰了,我们通过自定义一个Button来检验一下,下面开始上代码:

为了方便在xml中使用我们自定义的View,并且可以自定义扩大的触摸范围,我们再自定义一个attrs,res/values/attrs.xml:

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
   
     
     
     
     
     
   
 

Button实现:

public class LargeTouchableAreasButton extends Button { 
  private final int TOUCH_ADDITION = 0; 
  private int mTouchAdditiOnBottom= 0; 
  private int mTouchAdditiOnLeft= 0; 
  private int mTouchAdditiOnRight= 0; 
  private int mTouchAdditiOnTop= 0; 
  private int mPreviousLeft = -1; 
  private int mPreviousRight = -1; 
  private int mPreviousBottom = -1; 
  private int mPreviousTop = -1; 
 
  public LargeTouchableAreasButton(Context context) { 
    super(context); 
  } 
 
  public LargeTouchableAreasButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context, attrs); 
  } 
 
  public LargeTouchableAreasButton(Context context, AttributeSet attrs, 
      int defStyle) { 
    super(context, attrs, defStyle); 
    init(context, attrs); 
  } 
 
  private void init(Context context, AttributeSet attrs) { 
    TypedArray a = context.obtainStyledAttributes(attrs, 
        R.styleable.LargeTouchableAreaView); 
    int addition = (int) a.getDimension( 
        R.styleable.LargeTouchableAreaView_addition, TOUCH_ADDITION); 
    mTouchAdditiOnBottom= addition; 
    mTouchAdditiOnLeft= addition; 
    mTouchAdditiOnRight= addition; 
    mTouchAdditiOnTop= addition; 
    mTouchAdditiOnBottom= (int) a.getDimension( 
        R.styleable.LargeTouchableAreaView_additionBottom, 
        mTouchAdditionBottom); 
    mTouchAdditiOnLeft= (int) a.getDimension( 
        R.styleable.LargeTouchableAreaView_additionLeft, 
        mTouchAdditionLeft); 
    mTouchAdditiOnRight= (int) a.getDimension( 
        R.styleable.LargeTouchableAreaView_additionRight, 
        mTouchAdditionRight); 
    mTouchAdditiOnTop= (int) a.getDimension( 
        R.styleable.LargeTouchableAreaView_additionTop, 
        mTouchAdditionTop); 
    a.recycle(); 
  } 
 
  @Override 
  protected void onLayout(boolean changed, int left, int top, int right, 
      int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 
    if (left != mPreviousLeft || top != mPreviousTop 
        || right != mPreviousRight || bottom != mPreviousBottom) { 
      mPreviousLeft = left; 
      mPreviousTop = top; 
      mPreviousRight = right; 
      mPreviousBottom = bottom; 
      final View parent = (View) this.getParent(); 
      parent.setTouchDelegate(new TouchDelegate(new Rect(left 
          - mTouchAdditionLeft, top - mTouchAdditionTop, right 
          + mTouchAdditionRight, bottom + mTouchAdditionBottom), this)); 
    } 
  } 
 
} 

然后在具体要使用到这个Button的xml中加上以下代码:

xmlns:lta="http://schemas.android.com/apk/res/com.xxx.xxx" 

其中"lta"这个名字可以随便取,最后的是你的app包名。
最后在这个Button中定义希望增大的尺寸:

 

大功告成。

但这个自定义的View并不是完美的,还存在以下问题:

1、必须保证parent足够大,如果自定义的范围超出parent的大小,则超出的那部分无效。

2、一个parent只能设置一个触摸委派,设置多个时,只有最后设置的child有效。如果希望一个view能设置多个委派,需要再自定义parent,具体方法可参考:链接地址

总而言之,要触发委派,必须保证parent接收到了触摸事件,并且落在了你定义的范围内。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 优化 Android 按钮状态下的背景和文本颜色变化
    本文介绍如何通过 Android 的 Selector 实现按钮在不同状态下(如按压)的背景和文本颜色动态变化。我们将详细讲解实现步骤,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍超文本标记语言(HTML)的基本概念与语法结构。HTML是构建网页的核心语言,通过标记标签描述页面内容,帮助开发者创建结构化、语义化的Web页面。 ... [详细]
  • 本文介绍了如何通过设置背景形状来轻松地为 Android 的 TextView 添加圆形边框。我们将详细讲解 XML 代码的配置,包括圆角、描边和填充等属性。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • 本文详细介绍了Java Web应用程序中的过滤器(Filter)功能,包括其作用、实现方式及配置方法。过滤器可以在请求到达目标资源之前对其进行预处理,并在响应返回给客户端之前进行后处理。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 分享一个简化版的Silverlight链接图项目:Link Map Simplified
    本文介绍了一个使用Silverlight开发的可视化工具,主要用于展示和操作复杂的实体关系图(Graph)。该工具在犯罪调查系统中得到了广泛应用,帮助用户直观地获取和理解相关信息。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
  • 本文介绍了ArcXML配置文件的分类及其在不同服务中的应用,详细解释了地图配置文件的结构和功能,包括其在Image Service、Feature Service以及ArcMap Server中的使用方法。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文详细介绍了 RosPack 类的功能和用法,探讨了其在 ROS 系统中的重要作用。RosPack 类提供了类似于终端命令 rospack 的功能,能够方便地查询和管理 ROS 包的相关信息。 ... [详细]
author-avatar
勉情于你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有