AndroidがViewのクリック範囲を拡大する方法


下の図に示すように、UI要素は48 dp以下かもしれません。アイコンは32 dpしかなく、ボタンは40 dpしかありません。しかし、実際に操作可能なフォーカスエリアは48 dpのサイズに達するべきです。

小さいUIエリアを良好なタッチ・インタラクションを得るために、Viewの特性によって、現在2つの状況に遭遇しました。
1.ImageViewのように、そのpadding値を設定すると、タッチエリアが外に広がる。
2.Buttonのように、そのpadding値を設定しても、タッチエリアは変わらず、その内のコンテンツ表示エリアは内側に圧縮されます。
状況1のコントロールは、android:padding="10 dp"などの直接設定が可能です。 
状況2のコントロールは、タッチエリアをTouch Delegateで動的に変更し、クリック範囲を拡大する効果があります。

/**
 *   View          ,       View  
 *
 * @param view
 * @param top
 * @param bottom
 * @param left
 * @param right
 */
public static void expandViewTouchDelegate(final View view, final int top,
                                           final int bottom, final int left, final int right) {
 
    ((View) view.getParent()).post(new Runnable() {
        @Override
        public void run() {
            Rect bounds = new Rect();
            view.setEnabled(true);
            view.getHitRect(bounds);
 
            bounds.top -= top;
            bounds.bottom += bottom;
            bounds.left -= left;
            bounds.right += right;
 
            TouchDelegate touchDelegate = new TouchDelegate(bounds, view);
 
            if (View.class.isInstance(view.getParent())) {
                ((View) view.getParent()).setTouchDelegate(touchDelegate);
            }
        }
    });
}
この方法を取る2点の注意:
1、Viewのカスタムタッチ範囲がPartentのサイズを超えていると、超えた部分は無効になります。
2、一つのパーティではViewのTouch Delegateを一つしか設定できません。複数設定する場合は最後に設定したものだけ有効になります。
このビューのタッチ範囲を復元する必要がある場合:

/**
 *   View          ,     View    
 *
 * @param view
 */
public static void restoreViewTouchDelegate(final View view) {
 
    ((View) view.getParent()).post(new Runnable() {
        @Override
        public void run() {
            Rect bounds = new Rect();
            bounds.setEmpty();
            TouchDelegate touchDelegate = new TouchDelegate(bounds, view);
 
            if (View.class.isInstance(view.getParent())) {
                ((View) view.getParent()).setTouchDelegate(touchDelegate);
            }
        }
    });
}
Touch Delegateを使ってViewのタッチ応答範囲を拡大するのは比較的に柔軟な方法であり、paddingを設定する方式と組み合わせることもある。
更新
=======
後期の実際の開発では、post runnableを使ってDelegate領域サイズを設定する理由は、View師がActivityのOnCreate()やFragmentのOnCreateView()に描かれている場合、UIインターフェースはまだ描画されておらず、正しい座標が得られないためであることが判明した。
この方法をListViewのgetView()に適用してItemViewを描画すると、Delegateの設定が一部無効になります。ListViewの描画が特殊なため、一部がまだ描かれていないViewの正しい座標が得られないかもしれません。ソリューションの詳細は以下を参照して列を読むことができます。
参考文献:
Viewをカスタマイズすることによって、他の状況の処理もあります。
1.「AndroidはTouch Delegateを使ってViewのタッチ範囲を増やす」  //www.jb 51.net/articale/140894 ht m
2.「ListView Tips&Tricks菗5:Entlarged Touchable Ares」  http://cyrilmottier.com/2012/02/16/listview-tips-tricks-5-enlarged-touchable-areas/
3.「Exted touchable aras胫Android」  https://plus.google.com/u/0/+Julendokal/posts/8 zoV 3 RQvReS
以上はAndroidがViewのクリック範囲を拡大する方法の詳細です。AndroidがViewのクリック範囲を拡大することについての資料は他の関連記事に注目してください。