android 扩大view的响应区域


1.Android提供TouchDelegate帮助实现扩大一个很小的view的点击区域

例如:https://developer.android.com/training/gestures/viewgroup.html#delegate

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parent_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" >

     <ImageButton android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@null" android:src="@drawable/icon" />
</RelativeLayout>

代码

// Get the parent view
        View parentView = findViewById(R.id.parent_layout); parentView.post(new Runnable() { // Post in the parent's message queue to make sure the parent // lays out its children before you call getHitRect()
 @Override public void run() { // The bounds for the delegate view (an ImageButton // in this example)
                Rect delegateArea = new Rect(); ImageButton myButton = (ImageButton) findViewById(R.id.button); myButton.setEnabled(true); myButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(MainActivity.this, "Touch occurred within ImageButton touch region.", Toast.LENGTH_SHORT).show(); } }); // The hit rectangle for the ImageButton
 myButton.getHitRect(delegateArea); // Extend the touch area of the ImageButton beyond its bounds // on the right and bottom.
                delegateArea.right += 100; delegateArea.bottom += 100; // Instantiate a TouchDelegate. // "delegateArea" is the bounds in local coordinates of // the containing view to be mapped to the delegate view. // "myButton" is the child view that should receive motion // events.
                TouchDelegate touchDelegate = new TouchDelegate(delegateArea, myButton); // Sets the TouchDelegate on the parent view, such that touches // within the touch delegate bounds are routed to the child.
                if (View.class.isInstance(myButton.getParent())) { ((View) myButton.getParent()).setTouchDelegate(touchDelegate); } } });

简单解释

1. 获取parentView并且在UIThread上post一个Runnable,确保viewGroup在绘制子view之前得到子view的getHintRect(),getHintRect()返回就是该view在viewGroup中的点击区域

2.Find这个View,并且通过getHintRect()得到点击区域,rect

3.扩大点击范围即扩大rect的left,right,top,bottom

4.初始化TouchDelegate,并且将扩大后的rect和view对象作为参数传入

5.在viewGroup中设置touchDelegate,viewGroup会自动扩大该view的响应区域


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM