Android学习之 扩大控件点击触摸区域及TouchDelegate的介绍

本文介绍了在Android开发中如何解决控件点击区域过小的问题,通过使用TouchDelegate类来扩大按钮等控件的触摸响应区域,提供了一个代码示例和运行效果展示,帮助开发者更好地理解和应用这一技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       一、背景:在项目中,有时会遇到一类尴尬的问题:比如在UI上有一个图标按钮  但是按钮显示有点小   往往用户可能要点击23次才能点击到触发按钮点击事件。这样便给用户带来了困扰。现在小吕自我学习与分享一下如何解决这一尴尬问题。

             基本解决思路就是:扩大控件的点击触摸区域。

             这里 主要会用到TouchDelegate这个类,这个类代表的就是一个触摸区域。需要对该类进一步了解的可以查看官方API


   二、下面主要通过一个代码demo来展示如何扩大一个控件的点击触摸区域:

      1、首先贴出一个demo的运行效果图:

           


         2、 上面UI布局很简单,就一个文本TextViewImageButton,布局文件main.xml代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:gravity="center">
    
    <LinearLayout android:id="@+id/ll_parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:gravity="center"
        android:orientation="horizontal">
        
    <TextView
        android:layout_width="0dp"
        android:layout_weight="8"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"
        android:textSize="14dp"
        android:text="@string/msg" />
    
    <ImageButton android:id="@+id/ibtn_help"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_marginRight="18dp"
        android:background="@null"
        android:contentDescription="@null"
        android:src="@drawable/icon_i"/>
    
    </LinearLayout>
    
</RelativeLayout>

       3、处理扩大控件触摸区域的Activity类:MainActivity.java

package com.ice.touchdelegate;

import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.TouchDelegate;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.Toast;

public class MainActivity extends Activity {
	private static final String TAG = "MainActivity";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		View parent = findViewById(R.id.ll_parent);
		final ImageButton btn_help = (ImageButton)findViewById(R.id.ibtn_help);
		
		parent.post(new Runnable() {
			@Override
			public void run() {
				Log.d(TAG, "Runable invoke");
				// 构造一个 "矩型" 对象
				Rect delegateArea = new Rect();
				ImageButton delegate = btn_help;
				// Hit rectangle in parent's coordinates
				delegate.getHitRect(delegateArea);
				Log.d(TAG, "——————————原始触摸矩阵区域————————");
				Log.d(TAG, "width: "+delegateArea.width()+" | height: "+delegateArea.height());
				Log.d(TAG, "left: "+delegateArea.left + " | Top: "+delegateArea.top + 
						   " | right: "+delegateArea.right+" | bottom: "+delegateArea.bottom);
				
				// 扩大触摸区域矩阵值
				delegateArea.left -= 500;
				delegateArea.top -= 500;
				delegateArea.right += 500;
				delegateArea.bottom += 500;
				
				Log.d(TAG, "——————————扩大触摸区域后  矩阵区域————————");
				Log.d(TAG, "width: "+delegateArea.width()+" | height: "+delegateArea.height());
				Log.d(TAG, "left: "+delegateArea.left + " | Top: "+delegateArea.top + 
						   " | right: "+delegateArea.right+" | bottom: "+delegateArea.bottom);
				/**
				 * 构造扩大后的触摸区域对象
				 * 第一个构造参数表示  矩形面积
				 * 第二个构造参数表示 被扩大的触摸视图对象
				 * <也是本demo最核心用到的类之一>
				 */
				TouchDelegate expandedArea = new TouchDelegate(delegateArea, delegate);
				
				if(View.class.isInstance(delegate.getParent())){
					// 设置视图扩大后的触摸区域
					((View)delegate.getParent()).setTouchDelegate(expandedArea);
				}
			}
		});

		
		btn_help.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				Toast.makeText(MainActivity.this, "哈哈   被你点到啦", Toast.LENGTH_LONG).show();
			}
		});

	}
	
}

         4、测试效果

           要更好的体验到控件的触摸区域是否发生改变,可以修改MainActivity.java类中的扩大触摸区域矩阵值:

          本demo扩大了500个单位。你可以根据自己情况扩大1000或更大,反复修改触摸区域扩展值 运行程序,点击 触发比较。 后台log日志如下图:

             

            PS:小吕会尽量地在关键代码处添加注释 以便更好的理解,小吕会在不断的学习中完善自身。

                                                                                                        -------------- 希望能与大家一起学习、交流。

           欢迎大家扫一扫、关注我的微信公众号: Ice资讯助手

            

           


 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值