天天看點

使用TouchDelegate增大控件的觸摸範圍

轉載請注明出處: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,隻有最後一次調用會生效。

最後我們看一下上面那個例子的使用效果吧:

使用TouchDelegate增大控件的觸摸範圍

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>