1

さて、このコードでは、FlingGestureListener.class を呼び出すタイプのジェスチャ検出器のインスタンス変数を作成していることがわかります。エラーa super interface must be an interfaceが発生していますが、タイプ「インターフェイス」として作成しました。 xml レイアウト名を参照すると、FlingGestureListner を実装するため、studentGallery クラスは次のようになり、FlingGestureListener を実装します。

public class GalleryStudent extends Activity implements FlingGestureLitener {

     private static final int MAJOR_MOVE = 0;


    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_galery_student);

            final GestureDetector gdt = new GestureDetector(getActivity(),
            FlingGestureListener.getInstance(tabSwipeListener));
            final ImageView peopleTab = (ImageView)getActivity().findViewById(R.id.activity_galery_student);

            peopleTab.setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return gdt.onTouchEvent(event);
                }
            });
            Gallery g = (Gallery) findViewById(R.id.gallery);
            g.setAdapter(new ImageAdapter(this));

            g.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(@SuppressWarnings("rawtypes") AdapterView parent, View v, int position, long id) {
                    Toast.makeText(GalleryStudent.this, "" + position, Toast.LENGTH_SHORT).show();
                }
            });
        }

これを使用してクラスに移動しているため、ここで混乱しています:tabSwipeListener.onTabSwipe(true, PLACES_FRAGMENT);この場合、フラグメントをパラメーターとして使用していますが、私のクラスはフラグメントではありません.これに対応するためにクラスをフラグメントに変更する簡単な方法はありますか?また、cannot be resolved to a typeこの場合は onTabSwiperListener です。これは、インターフェイスとして作成した説明から使用した FlingGestureListener です。

public class FlingGestureListener extends SimpleOnGestureListener {

private static final int SWIPE_MIN_DISTANCE = 80;
private static final int SWIPE_THRESHOLD_VELOCITY = 50;
private static final int PEOPLE_FRAGMENT = 0;
private static final int PLACES_FRAGMENT = 2;
private OnTabSwipedListener tabSwipeListener;

private FlingGestureListener(OnTabSwipedListener tabSwipeListener){
    this.tabSwipeListener = tabSwipeListener;

}

/**
 * Static factory
 * @param listener called when tab swiped
 * @return
 */
public static FlingGestureListener getInstance(OnTabSwipedListener listener){
    return new FlingGestureListener(listener);
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){
    if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
        Log.d("SWIPE", "right to left");
        tabSwipeListener.onTabSwipe(true, PLACES_FRAGMENT); //sent int to fragment container to switch pager to that view 
        return true; //Right to left
    } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
        Log.d("SWIPE", "left to right");
        tabSwipeListener.onTabSwipe(true, PEOPLE_FRAGMENT);
        return true; //Left to right 
    }

    //This will test for up and down movement. 
    if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
        return false; //Bottom to top
    } else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
        return false; //Top to bottom 
    }

    return false;
    }

}

これまでご協力いただきありがとうございました。

4

1 に答える 1

1

onFlingSimpleOnGestureListener classのメンバーが使用できるメソッドです。このメソッドをオーバーライドするには、(1) 拡張するクラスを作成するSimpleOnGestureListenerか、(2) 既存のクラス内にジェスチャ リスナーを実装する必要があります。その後、オーバーライドできますonFling

アップデート

遅れて申し訳ありません。これが私の実装です。使用するアクティビティで、カスタムリスナーを使用onFlingする を設定する必要があります。以下のコードを使用していることがわかります。特定の画像 peopleTab のタッチをリッスンしていますが、任意のビューに置き換えることができるはずです。GestureDetectoronFlingFlingGestureListener

    final GestureDetector gdt = new GestureDetector(getActivity(),    FlingGestureListener.getInstance(tabSwipeListener));
    final ImageView peopleTab = (ImageView)getActivity().findViewById(R.id.peopleFlag);

    peopleTab.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return gdt.onTouchEvent(event);
        }
    });

次に、FlingGestureListener については、拡張する別のクラスを使用して、SimpleOnGestureListener実装のみを選択できるようにします。onFling

public class FlingGestureListener extends SimpleOnGestureListener {

private static final int SWIPE_MIN_DISTANCE = 80;
private static final int SWIPE_THRESHOLD_VELOCITY = 50;
private static final int PEOPLE_FRAGMENT = 0;
private static final int PLACES_FRAGMENT = 2;
private OnTabSwipedListener tabSwipeListener;

private FlingGestureListener(OnTabSwipedListener tabSwipeListener){
    this.tabSwipeListener = tabSwipeListener;
}

/**
 * Static factory
 * @param listener called when tab swiped
 * @return
 */
public static FlingGestureListener getInstance(OnTabSwipedListener listener){
    return new FlingGestureListener(listener);
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){
    if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
        Log.d("SWIPE", "right to left");
        tabSwipeListener.onTabSwipe(true, PLACES_FRAGMENT); //sent int to fragment container to switch pager to that view 
        return true; //Right to left
    } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
        Log.d("SWIPE", "left to right");
        tabSwipeListener.onTabSwipe(true, PEOPLE_FRAGMENT);
        return true; //Left to right 
    }

    //This will test for up and down movement. 
    if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
        return false; //Bottom to top
    } else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
        return false; //Top to bottom 
    }

    return false;
}

}

このクラスからのコールバックを使用して、スワイプが発生したことを示します。返されるブール値は、タッチ イベント全体が処理されたかどうかを示すためのものです。うまくいけば、これが役に立ちます。

更新 2

インターフェイスでは、セットアップに固有のものを使用しています。

tabSwipeListener.onTabSwipe(true, PLACES_FRAGMENT); 

これは、最初にスワイプが発生したことと、その方向を示します。これを 3 フラグメントのViewPagerセットアップで使用します。真ん中のページから右にスワイプすると場所のリストに移動し、左にスワイプすると人のリストに移動します。たとえば、PLACES_FRAGMENT 定数は、 内のフラグメント ID を参照する整数ですViewPager。その整数を返すとViewPager、ページを効果的に移動する位置 2 にフラグメントを表示するように変更するように伝えることができます。

これがあなたがする必要があることを知らないので、コード例を示す方法がわかりません。スワイプを検出する必要があるだけの場合、インターフェイスはブール値を返すだけで済みます。onFlingtrue の場合、メソッドが呼び出され、設定したしきい値基準が満たされていることがわかります。次に、アプリのコンテキスト内でその応答を適切に処理する必要があります。私があなたにできるアドバイスはこれ以上ないと思います。

于 2013-09-27T17:35:39.893 に答える