7

私はフレームレイアウトを持っています:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp" >

<LinearLayout
    android:id="@+id/widgetView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:layout_margin="10dp"
    android:gravity="center" >
</LinearLayout>

<LinearLayout
    android:id="@+id/widgetOverlayFrame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="false" >
</LinearLayout>

最初のレイアウトにはウィジェット レイアウトが含まれており、2 番目のレイアウトは透過的であり、メソッドをドラッグするために onLongClick を受け取ります。問題は、ウィジェットとやり取りしたいとき、何かをクリックするとき、クリック イベントが overlayFrame によって取得されることです。クリックイベントをoverlayFrameからwidgetViewに渡すにはどうすればよいですか?

編集:

今、GestureLister を overlayFrame LinearLayout にアタッチして、シングル クリックとロング クリックを表す MotionEvent の違いを何らかの方法で確認しようとしています。私が直面している問題は、ジェスチャ リスナーの OnLongPress が、シングル クリックまたはロング クリックのように常に呼び出されることです。

この動作の説明はありますか? Tnx!

4

5 に答える 5

0

上部のレイアウトにa を設定する代わりに、拡張してそのメソッドをオーバーライドGestureListenerする独自のクラスを作成する必要があります。そこで、ロングクリック\ショートクリックなどのロジックを実装できます。LinearLayoutonTouchEvent

クリック イベントは最初にウィジェット レイアウトに送信され、処理されない場合 (つまり return ) にのみ、上部のレイアウトで取得されますonTouchEventfalse

編集:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp" >

<LinearLayout
android:id="@+id/widgetView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="10dp"
android:gravity="center" >
</LinearLayout>

<com.example.touchtesting.MyLinearLayout
android:id="@+id/widgetOverlayFrame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false" >
</com.example.touchtesting.MyLinearLayout>

</FrameLayout>

com.example.touchtestingをパッケージの名前に変更します。これはクラスです:

        public class MyLinearLayout extends LinearLayout{

        public MyLinearLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        private long startClick = 0;

        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    startClick = ev.getEventTime();
                    break;
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    if (ev.getEventTime() - startClick < 500) {
                        Log.i("example","short click");
                    }
                    else {
                        Log.i("example","long click");
                    }
                    break;
            }

            return true;
        }

    }
于 2012-11-27T22:25:39.527 に答える
0

オーバーレイの属性を設定するandroid:focusable="false"か、それでandroid:focusableInTouchMode="false"十分でしょう。

onInterceptTouchEvent独自のオーバーレイ ウィジェットを作成し、そのメソッドをオーバーライドして、常に false を返すこともできます。

public class NotTouchableLinearLayout extends LinearLayout {

    // Override constructors
    // ...

   @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return false;
    }
}
于 2012-11-21T08:59:27.260 に答える
0

GestureListener を使用する代わりに、この方法で onTouchListener をオーバーライドできます。

これにより、タイマーが切れると longPress が呼び出され、その間にアップが発生すると、LongPress がキャンセルされます

   CountDownTimer c;
    long time=5000;
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                c= new CountDownTimer(5000, 1000) {
                          public void onTick(long millisUntilFinished) {
                                  time=millisUntilFinished;
                           }

                          public void onFinish() {
                                 Log.i("","LONG PRESS");
                           }}.start();

            break;
            case MotionEvent.ACTION_UP:
                if (time>0) {
                    Log.i("example","short click");
                    c.cancel();
                }
            break;
        }

        return true;
    }
于 2012-11-30T10:33:29.217 に答える