3

問題

ボタンを最初に押すと、他の3つのボタンの可視性が消えてから可視に設定される効果を作成しようとしています。新しく表示されたボタンの 1 つに向かってスワイプして終了した後、別のアクティビティを開始したいと思います。

私の問題は、ビューの位置を取得するために使用する方法 (Rect オブジェクト、findNearestTouchable を使用) と位置タッチ イベント (ACTION_UP で onTouch/Gestures を使用) に関係なく、それらが一致するようには見えず、戻ることができないことです。私が望むビュー;

望ましい機能

ボタンの押下から開始し、別のボタンで終了するモーション イベントで、終了したボタンの id/view オブジェクトを返します。

私のmain_menu.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true"
    android:orientation="vertical" >


    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Button"        
        android:tag="1"

        />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/button1"
        android:layout_marginBottom="36dp"
        android:layout_marginRight="19dp"
        android:layout_toLeftOf="@+id/button1"
        android:text="Button"
        android:visibility="gone"
        android:tag="3" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button3"
        android:layout_alignBottom="@+id/button3"
        android:layout_toRightOf="@+id/button3"
        android:text="Button"
        android:visibility="gone" 
        android:tag="2"/>

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button3"
        android:layout_alignBottom="@+id/button3"
        android:layout_alignParentRight="true"
        android:layout_marginRight="20dp"
        android:text="Button"
        android:visibility="gone"
        android:tag="4" />

</RelativeLayout>

設定されていないActivityでの現在の試み foundit(私は完全に異なる実装に対して非常にオープンです)

public class Menu extends Activity {
    private GestureDetector gestureDetector;
    View.OnTouchListener gestureListener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_menu);

        gestureDetector = new GestureDetector(new MyGestureDetector());
        gestureListener = new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                View findViewById2 = findViewById(R.id.button2);
                View findViewById3 = findViewById(R.id.button3);
                View findViewById4 = findViewById(R.id.button4);
                findViewById2.setVisibility(View.VISIBLE);
                findViewById3.setVisibility(View.VISIBLE);
                findViewById4.setVisibility(View.VISIBLE);
                return gestureDetector.onTouchEvent(event);
            }
        };
        View button = findViewById(R.id.button1);
        button.setOnTouchListener(gestureListener);

    }

    class MyGestureDetector extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {

            View foundit = null;
            ViewGroup menu = (ViewGroup) findViewById(R.id.button1).getParent();
            for (int numChildren = menu.getChildCount(); numChildren >= 0; --numChildren) {
                View child = menu.getChildAt(numChildren - 1);
                if (child instanceof Button) {
                    Rect bounds = new Rect();
                    child.getHitRect(bounds);
                    if (bounds.contains((int) e2.getX(), (int) e2.getY())) {
                        foundit = child;
                    }
                }
            }
            if (foundit != null) {
                Log.i("found", "FOUND IT");
            }
            return false;
        }

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }
    }

}

誰にも洞察力がありますか?

編集

以下をテストします。

    gestureListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            View findViewById2 = findViewById(R.id.button2);
            View findViewById3 = findViewById(R.id.button3);
            View findViewById4 = findViewById(R.id.button4);
            findViewById2.setVisibility(View.VISIBLE);
            findViewById3.setVisibility(View.VISIBLE);
            findViewById4.setVisibility(View.VISIBLE);
            if (event.getAction() == MotionEvent.ACTION_UP) {
                Log.i("TOUCH X IS", Float.toString(event.getRawX()));
                Log.i("TOUCH Y IS", Float.toString(event.getRawY()));
            }
            for (int numChildren = ((ViewGroup) v.getParent())
                    .getChildCount(); numChildren >= 0; --numChildren) {
                View child = ((ViewGroup) v.getParent())
                        .getChildAt(numChildren - 1);
                if (child instanceof Button) {
                    Rect bounds = new Rect();
                    child.getHitRect(bounds);
                    Log.i(child.getTag().toString() + " CENTER X IS",
                            Float.toString(bounds.exactCenterX()));
                    Log.i(child.getTag().toString() + " CENTER Y IS",
                            Float.toString(bounds.exactCenterY()));
                }
            }
            return false;
        }
    };

次の LogCat 出力が生成されます。

07-06 01:12:58.245: TOUCH X IS(20965): 394.0

07-06 01:12:58.245: TOUCH Y IS(20965): 297.0

07-06 01:12:58.245: 4 CENTER X IS(20965): 392.0

07-06 01:12:58.245: 4 CENTER Y IS(20965): 219.0

07-06 01:12:58.245: 2 CENTER X IS(20965): 240.0

07-06 01:12:58.250: 2 CENTER Y IS(20965): 219.0

07-06 01:12:58.250: 3 CENTER X IS(20965): 95.0

07-06 01:12:58.250: 3 CENTER Y IS(20965): 219.0

07-06 01:12:58.250: 1 CENTER X IS(20965): 240.0

07-06 01:12:58.250: 1 CENTER Y IS(20965): 345.0

4

2 に答える 2

0

ジェスチャ リスナーで、MotionEvent が MotionEvent.ACTION_UP であることを確認し、座標 event.getX() および event.getY() を使用して、それらの座標にあるビューを特定します。

public boolean onTouch(View view, MotionEvent event) {
  if (event == MotionEvent.ACTION_UP) {
    int x = event.getX();
    int y = event.getY();
    //find what view is at x, y
  }
}

最初のボタンが押されたときに (onClick を使用するか、モーション イベントが ACTION_DOWN のときに) 何らかのフラグをトリガーします。次に、指を離すと上記が起動されます。

編集: event.getRawY() ではなく、必ず event.getY() を使用してください。計算は異なり、ボタンの境界は getY() と同じ方法で計算されます。

于 2012-07-05T23:53:15.267 に答える