7

私は (Galaxy Nexus で) アプリケーションに取り組んでいますが、ベゼルの下部から画面にスワイプすると、Google が「Google Now」アプリケーションを実装していることに気付きました (Chrome ブラウザもしばらくの間これを行いましたが、そうではありませんでした)。まだあるかどうか確認してください)。私は周りを見回してきましたが、彼らがどのようにこれを達成したかを判断できませんでした. 画面ではなくベゼルで開始するジェスチャを処理する簡単な方法はありますか?

参照用に開発者ページを確認しましたが、見つけた唯一の記事は次のとおりです。

http://developer.android.com/design/patterns/gestures.html

この情報を入手できる場所は他にありますか?

[編集]

Lain_B の方法に基づいてエッジ ジェスチャを動作させようとして非常に失敗しましたが、動作させることはできません。ジェスチャを検出しようとするために使用しているコードは次のとおりですが、logcatは常にゼロを出力しています...

public class MainActivity extends Activity implements OnGestureListener {

private GestureDetector myGesture;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    myGesture = new GestureDetector(getBaseContext(),
            (OnGestureListener) this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.e("Flags Touch", "Flags: " + event.getEdgeFlags());
    return myGesture.onTouchEvent(event);
}

@Override
public boolean onDown(MotionEvent e) {
    Log.e("Flags", "Flags: " + e.getEdgeFlags());
    Log.e("Event", "onDown");
    // TODO Auto-generated method stub
    return false;
}

@Override
public void onLongPress(MotionEvent e) {
    Log.e("Event", "onLongPress");
    // TODO Auto-generated method stub

}

@Override
public void onShowPress(MotionEvent e) {
    Log.e("Flags", "Flags: " + e.getEdgeFlags());
    Log.e("Event", "onShowPress");
    // TODO Auto-generated method stub

}

@Override
public boolean onSingleTapUp(MotionEvent e) {
    Log.e("Event", "onSingleTapUp");
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
    // Log.e("Event", "onScroll");
    return false;
}

// these constants are used for onFling
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {

    Log.e("Event", "onFling");
    Log.e("Flags", "Flags: " + e1.getEdgeFlags());

    if (e1.getEdgeFlags() == MotionEvent.EDGE_LEFT) {
        // code to handle swipe from left edge
        Log.e("!!!!!", "Edge fling!");
    }

    try {
        // do not do anything if the swipe does not reach a certain length
        // of distance
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
            return false;

        // right to left swipe
        if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) < SWIPE_THRESHOLD_VELOCITY) {

        }
        // left to right swipe
        else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) < SWIPE_THRESHOLD_VELOCITY) {

        }
    } catch (Exception e) {
        // nothing
    }
    return false;

}
}

[編集2]

Lain_B の要求された出力で...

(Nexus 7を使用)...ベゼルの可能な限り左のポイントから開始し、右にスワイプして中央(っぽい)にします。

08-16 16:44:13.674: I/Fling(16702): Flags: 0
08-16 16:44:13.674: I/Fling(16702): e1: 2.5 711.5152
08-16 16:44:13.674: I/Fling(16702): e2: 215.4591 717.08105

画面中央から画面外へ(右側へ)スワイプ

08-16 16:46:37.364: I/Fling(16702): Flags: 0
08-16 16:46:37.364: I/Fling(16702): e1: 392.5 758.1818
08-16 16:46:37.364: I/Fling(16702): e2: 783.4375 743.3334
4

3 に答える 3

9

MotionEvent.getEdgeFlags()が探しているものだと思います。次に、返された値をEDGE_LEFT、 EDGE_RIGHT などと比較して、どのエッジに触れたかを確認できます。

if( event1.getEdgeFlags()&MotionEvent.EDGE_LEFT != 0 ){
    //code to handle swipe from left edge
}

また

if( e1.getX() < 5.0f ){
    //handle swipe from left edge
}
于 2012-08-15T14:01:20.127 に答える
7

MotionEvent.getEdgeFlags に依存するのは間違っています。詳細については、このディスカッションを参照してください: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/ZNjpzbkxeNM

概念的にエッジ スワイプを検出するには、ドラッグ/スクロール イベントを検出する必要があります。また、ダウン イベントの元の「x」座標がエッジからある程度の距離内にあることを確認する必要があります。

これを行う最も簡単な方法は、GestureDetector を使用してドラッグ/スクロールを検出することです。幸いなことに、SimpleOnGestureListener の onScroll メソッドには必要なものがすべて揃っています。

したがって、次のようになります (SimpleOnGestureListener で構成された GestureDetector を使用している場合):

 public boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {

        if (e1.getX() < SOME_DISTANCE_FROM_SCREEN) {
           //your code  
           return true;
        }
        return false;
 }
于 2013-05-08T22:50:39.340 に答える