转载请注明出处:http://blog.csdn.net/fishle123/article/details/50809872
在很多Android应用有时候为了美观,有时候可能受限于屏幕大小,有些控件不能显示太大。但是控件太小,又不方便用户点击,影响体验。有没有办法可以在不调整控件大小的情况增大控件接收触摸事件的范围呢?使用TouchDelegate就可以解决这个问题了。
TouchDelegate的使用非常简单,假如我想增大一个Button的触摸范围,下面几行代码即可轻松实现:
mBtnHello = (Button) findViewById(R.id.btnHello); mBtnHello.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub int left = mBtnHello.getLeft(); int top = mBtnHello.getTop(); int right = mBtnHello.getRight(); int bottom = mBtnHello.getBottom(); Rect bouds = new Rect(left - 200, top - 200, right + 200, bottom + 200); TouchDelegate delegate = new TouchDelegate(bouds, mBtnHello); ((View) mBtnHello.getParent()).setTouchDelegate(delegate); } });
在这段代码,在第12----13行先创建了一个TouchDelegate,然后调用Button的父视图来设置TouchDelegate,这样就可以增大Button的点击范围了。创建TouchDelegate的时候,涉及到两个参数,其中一个就是Button,也就是我们想增大点击范围的控件;另一个是一个Rect,它表示在这个Rect矩形范围内发生触摸的时候都传递给Button来处理。在上面,我们把Button的触摸范围向四周扩大了200pixel。需要注意的是,如果多次调用setTouchDelegate,只有最后一次调用会生效。
最后我们看一下上面那个例子的使用效果吧:
MainActivity的代码如下:
public class MainActivity extends Activity { private Button mBtnHello; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtnHello = (Button) findViewById(R.id.btnHello); int left = mBtnHello.getLeft(); int top = mBtnHello.getTop(); int right = mBtnHello.getRight(); int bottom = mBtnHello.getBottom(); Log.i("--->", "left:+" + left + ",top:" + top + ",right:" + right + ",bottom:" + bottom); mBtnHello.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub int left = mBtnHello.getLeft(); int top = mBtnHello.getTop(); int right = mBtnHello.getRight(); int bottom = mBtnHello.getBottom(); Log.i("--->", "post---left:+" + left + ",top:" + top + ",right:" + right + ",bottom:" + bottom); Rect bouds = new Rect(left - 200, top - 200, right + 200, bottom + 200); TouchDelegate delegate = new TouchDelegate(bouds, mBtnHello); ((View) mBtnHello.getParent()).setTouchDelegate(delegate); } }); mBtnHello.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_SHORT).show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
对应的xml布局文件R.layout.activity_main:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/btnHello" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="@string/hello_world" /> </RelativeLayout>