1

ユーザーの指がプログラムでビュー内にあるときにリッスンする方法はありますか? 私が欲しいのは、ユーザーが指をビューの外に移動したときに、ビュー内のユーザーの指が異なる状態になる場合です。

これは xml で実行できることはわかっていますが、サードパーティのライブラリを使用しているため、それができないため、プログラムで実行する方法を見つける必要があります。

4

1 に答える 1

1

ビューにタッチ リスナーを設定し、x スポットと y スポットを比較します

http://developer.android.com/reference/android/view/View.html#onTouchEvent(android.view.MotionEvent )

ユーザーがタッチダウンした開始位置を記録する

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_DOWN

オフセットを追跡します。

別の質問のために私が書いたビューリスナーコードを次に示します。

float initialX = 0;
float initialY = 0;
int currentFocusedChild = 0;
List<View> children;

public void walkElements() {
    final LinearLayout mainLayout = (LinearLayout) findViewById(R.id.main_layout);
    children = mainLayout.getFocusables(View.FOCUS_FORWARD);
    mainLayout.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    initialX = event.getX();
                    initialY = event.getY();                        
                    break;
                case MotionEvent.ACTION_MOVE:
                    float diffX = event.getX() - initialX;
                    float diffY = event.getY() - initialY;

                    if(diffY > 0) {
                        if (currentFocusedChild < children.size() - 1) {
                            currentFocusedChild++;
                        }
                    } else {
                        if (currentFocusedChild > 0) {
                            currentFocusedChild--;
                        }
                    }
                    children.get(currentFocusedChild).setSelected(true);

                    //Sleep for a period of time so the selection is slow enough for the user.
                    Thread.sleep(300);
                    break;
                case MotionEvent.ACTION_UP:
                    children.get(currentFocusedChild).performClick();
                    break;
            }
            return false;
        }
    });

}
于 2012-09-06T03:59:17.970 に答える