我想在我的Android应用程序中使用 fling
手势检测功能 .
我所拥有的是包含9 ImageView
的 GridLayout
. 来源可以在这里找到:Romain Guys's Grid Layout .
我拿的那个文件来自Romain Guy的Photostream application,并且只是略微适应了 .
对于简单的点击情况,我只需要为每个 ImageView
设置 onClickListener
我添加为实现 View.OnClickListener
的主 activity
. 实现识别 fling
的东西似乎无比复杂 . 我认为这是因为它可能跨越 views
?
- 如果我的活动实现
OnGestureListener
我不知道如何将其设置为我添加的Grid
或Image
视图的手势监听器 .
public class SelectFilterActivity extends Activity implements
View.OnClickListener, OnGestureListener { ...
- 如果我的活动实现了
OnTouchListener
那么我没有onFling
方法override
(它有两个事件作为参数,允许我确定投掷是否值得注意) .
public class SelectFilterActivity extends Activity implements
View.OnClickListener, OnTouchListener { ...
- 如果我创建自定义
View
,如GestureImageView
,扩展ImageView
我不知道如何告诉活动从视图中发生了fling
. 在任何情况下,我试过这个,当我触摸屏幕时没有调用方法 .
我真的只需要一个跨视图的具体例子 . 什么,何时以及如何附上这个 listener
?我还需要能够检测单击 .
// Gesture detection
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int dx = (int) (e2.getX() - e1.getX());
// don't accept the fling if it's too short
// as it may conflict with a button push
if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.absvelocityY)) {
if (velocityX > 0) {
moveRight();
} else {
moveLeft();
}
return true;
} else {
return false;
}
}
});
是否可以在屏幕顶部放置透明视图来捕捉啪啪声?
如果我从XML中选择不使用 inflate
我的子图像视图,我可以将 GestureDetector
作为构造函数参数传递给我创建的 ImageView
的新子类吗?
这是一个非常简单的活动,我试图让 fling
检测工作:SelectFilterActivity (Adapted from photostream) .
我一直在看这些来源:
到目前为止,没有什么对我有用,我希望得到一些指示 .
18 回答
我 Build 了一个更通用的类,我使用了Tomas的类,并添加了一个将事件发送到Activity或Fragment的接口 . 它将在构造函数上注册侦听器,因此请确保实现接口或者ClassCastException将是thorwn . 接口返回类中定义的四个final int之一,并返回激活它的视图 .
如果您不想创建单独的类或使代码复杂,
您可以在OnTouchListener中创建一个GestureDetector变量,使代码更容易
namVyuVar可以是您需要设置列表器的View的任何名称
上面的答案之一提到处理不同的像素密度,但建议手动计算滑动参数 . 值得注意的是,您实际上可以使用
ViewConfiguration
类从系统获得缩放的合理值:我注意到使用这些值会导致应用程序和系统其余部分之间的“感觉”更加一致 .
上面的滑动手势检测器代码非常有用!但是,您可能希望通过使用以下相对值
(REL_SWIPE)
而不是绝对值(SWIPE_)
来使此解决方案密度不可知 .感谢Code Shogun,他的代码我适应了我的情况 .
让您的活动像往常一样实施
OnClickListener
:将手势监听器附加到添加到主布局的所有视图中;
当你的被覆盖的方法被击中时,请注意,活动的
onClick(View v)
和手势监听器的onFling
.帖子'fling'舞蹈是可选的,但鼓励 .
也作为一个小的增强 .
try / catch块的主要原因是e1对于初始移动可能为null . 除了try / catch之外,还包括null和return的测试 . 类似如下
您可以使用droidQuery库来处理flings,click,long clicks和自定义事件 . 该实现基于我之前的答案,但droidQuery提供了一个灵活,简单的语法:
原始答案
这个答案使用了其他答案中的组件组合 . 它由
SwipeDetector
类组成,该类具有用于侦听事件的内部接口 . 我还提供RelativeLayout
来显示如何覆盖View
的onTouch
方法以允许滑动事件和其他检测到的事件(例如点击或长按) .SwipeDetector
Swipe Interceptor View
Thomas Fankhauser和Marek Sebera提出的我的解决方案版本(不处理垂直滑动):
SwipeInterface.java
ActivitySwipeDetector.java
这里有很多很棒的信息 . 不幸的是,很多这种处理代码分散在各种完成状态的各个站点上,尽管人们会认为这对许多应用程序来说都是必不可少的 .
我花时间创建了一个fling listener来验证是否符合相应的条件 . 我添加了一个page fling listener,它增加了更多检查以确保晃动达到翻页的门槛 . 这两种侦听器都允许您轻松地将晃动限制在水平轴或垂直轴上 . 您可以在view for sliding images中看到它是如何使用的 . 我承认这里的人已完成了大部分的研究 - 我只是把它放在一个可用的库中 .
最近几天代表我第一次尝试在Android上编码;期待much more来 .
这个问题有点陈旧,2011年7月谷歌发布了Compatibility Package, revision 3),其中包括适用于Android 1.6的
ViewPager
. 发布此问题的GestureListener
答案正在寻找用于在Android画廊中切换照片或在新的Play Market应用中切换视图时使用的代码,然后肯定是ViewPager
.Here's some links for more info:
http://android-developers.blogspot.com/2011/08/horizontal-view-swiping-with-viewpager.html
http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/
http://thepseudocoder.wordpress.com/2011/10/05/android-page-swiping-using-viewpager/
对所有人:不要忘记 case MotionEvent.ACTION_CANCEL:
它在没有ACTION_UP的情况下调用30%的滑动
在这种情况下它等于ACTION_UP
我做的有点不同,并编写了一个额外的检测器类来实现
View.onTouchListener
onCreate
只是将它添加到最低的布局,如下所示:其中id.lowestLayout是布局层次结构中最低视图的id.xxx,而LowestLayout被声明为RelativeLayout
然后有实际的活动刷卡检测器类:
对我来说真的很好用!
我从 Thomas Fankhauser 略微修改并修复了解决方案
整个系统由两个文件组成, SwipeInterface 和 ActivitySwipeDetector
SwipeInterface.java
探测器
它像这样使用:
在实现
Activity
时,您需要实现 SwipeInterface 中的方法,并且您可以找到调用Swipe事件的View .我知道为时已晚,无法回答但仍然发布 Swipe Detection for ListView 如何在ListView项目中使用Swipe Touch Listener .
参考:Exterminator13(本页答案之一)
制作一个 ActivitySwipeDetector.class
Call it from your activity class like this:
并且不要忘记实现 SwipeInterface ,它将为您提供两个@override方法:
手势是触发触摸屏和用户之间交互的微妙动作 . 它持续从屏幕上的第一次触摸到最后一根手指离开表面之间的时间 .
Android为我们提供了一个名为GestureDetector的类,使用它我们可以检测常见的手势,如向下和向上,垂直和水平滑动(fling),长按和双按,双击等,并将听众附加到它们 .
制作我们的活动class implement GestureDetector.OnDoubleTapListener(用于双击手势检测)和GestureDetector.OnGestureListener interfaces并实现所有抽象方法 . 有关详细信息 . 你可以访问https://developer.android.com/training/gestures/detector.html . Courtesy
用于演示测试 . GestureDetectorDemo
如果有人想要一个有效的实现,这是顶部两个答案的综合答案 .
有一个内置界面,您可以直接使用所有手势:
以下是基本级别用户的解释:
有两个进口要小心选择两者都不同
在Web(和本页)上有一些使用ViewConfiguration的命题 . getScaledTouchSlop() 具有
SWIPE_MIN_DISTANCE
的设备缩放值 .getScaledTouchSlop()
用于“ scrolling 阈值" distance, not swipe. The scrolling threshold distance has to be smaller than a "页面间摆动”阈值距离 . 例如,此功能在我的Samsung GS2上返回12个像素,此页面中引用的示例大约为100像素 .使用API Level 8(Android 2.2,Froyo),您有 getScaledPagingTouchSlop() ,用于页面滑动 . 在我的设备上,它返回24(像素) . 因此,如果您的API级别<8,我认为“2 *
getScaledTouchSlop()
" should be the " standard”滑动阈值 . 但我的小屏幕应用程序的用户告诉我它太少了......在我的应用程序中,您可以垂直滚动,并水平更改页面 . 使用建议的值,它们有时会更改页面而不是滚动 .