2012-08-15 76 views
5

我正在研究应用程序(在Galaxy Nexus上),并且我注意到当您从挡板底部滑动到屏幕上时,Google实施了“Google即时”应用程序(Chrome浏览器也是做了这一段时间,不知道它是否仍然如此)。我一直在环顾四周,但一直无法确定他们是如何完成这一任务的。是否有一种简单的方法可以处理从屏幕上而不是屏幕上开始的手势?与Android的边框手势

我检查了参考开发商的页面,但我唯一能找到的文章在这里:

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 
+0

我不知道,但你在找这个? http://developer.android.com/reference/android/view/GestureDetector.html – 2012-08-15 13:54:19

+0

我已经在使用手势监听器,我只是试图确定如何从屏幕边界外启动时如何实现它。 – RyanInBinary 2012-08-15 13:58:11

回答

8

我觉得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 
} 
+0

钉住它。谢谢Lain! – RyanInBinary 2012-08-15 14:08:00

+0

在过去的几天里,我一直在改进我的代码。我很高兴能提供帮助,但是这些问题都出现在我已经做了相当多工作的地方。 – 2012-08-15 14:12:48

+1

好的,所以这仍然不适合我,我将它添加到我的onFling事件中,并且它总是返回0x0边缘标志(没有任何触及)。我错过了什么吗? Jellybean的系统用户界面是否会覆盖使用这些界面的任何尝试,因为它正在倾听“Google即时”从屏幕底部向上滑动?我试图在类似的功能上工作,但从左/右边缘 – RyanInBinary 2012-08-15 17:31:34

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; 
} 
+0

这很简单,对我来说效果很好 – Mike 2013-08-29 17:10:25

+1

与屏幕有些距离是什么意思?它的目的是什么?我不理解上面的代码。 – ilikeyoyo 2014-10-27 15:11:55

+0

@Rarster您定义了一些常量,用于标记屏幕边缘的最大接受距离,其中触摸事件将被视为边缘滑动。 – ataulm 2015-04-09 07:43:52