Жесты ободок с Android

Я работаю над приложением (на 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) … Начиная с максимально возможной левой точки на панели и прокручивая прямо к середине (ish).

 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 

Solutions Collecting From Web of "Жесты ободок с Android"

Я думаю, что 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 } 

Неверно полагаться на MotionEvent.getEdgeFlags. См. Это обсуждение для получения дополнительной информации: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/ZNjpzbkxeNM

Концептуально для обнаружения прокрутки края вам нужно обнаружить событие перетаскивания / прокрутки, а также убедиться, что исходная координата «x» события «вниз» находится на некотором расстоянии от края.

Самый простой способ сделать это – использовать GestureDetector для обнаружения перетаскивания / прокрутки. К счастью onScroll метод SimpleOnGestureListener имеет все, что вам нужно.

Так что-то вроде этого (если вы используете GestureDetector, настроенный с помощью SimpleOnGestureListener):

  public boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (e1.getX() < SOME_DISTANCE_FROM_SCREEN) { //your code return true; } return false; }