The*_*ter 11 android listview gestures
更新:请参阅赏金以了解扩展问题.
我有一个GestureDetector设置ListView.ListView是一个完整的片段,它来自窗口的一侧并部分覆盖另一个片段.我想让用户能够将其轻扫(即Wunderlist是右侧此功能的一个很好的例子).
这是我的设置:
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
listView.setOnTouchListener(gestureListener);
Run Code Online (Sandbox Code Playgroud)
听众本身:
public class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_MIN_DISTANCE = 180;
private static final int SWIPE_THRESHOLD_VELOCITY = 50;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
try {
if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
FragmentManager fma = getActivity()
.getSupportFragmentManager();
FragmentManager fm = getFragmentManager();
FragmentTransaction t = fm.beginTransaction();
SherlockListFragment mFrag = new RateReviewFragment();
t.add(R.id.main_frag, mFrag);
t.setCustomAnimations(R.anim.animation_enter,
R.anim.animation_leave);
t.remove(mFrag);
t.commit();
}
return false;
} catch (Exception e) {
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// edited out; this opens up a context menu
}
}
Run Code Online (Sandbox Code Playgroud)
有时,当ListView滚动到底部(或列表滚动被列表行点击中断)时,GestureListener只是停止...听.刷卡不起作用.您必须滚动到顶部才能让它再次运行.
如果有人能帮我隔离这些问题,我将不胜感激!
更新:只有一个问题,"听众停止听"
更新二:我可能已经弄明白这是什么原因; 只是不知道修复:
在记录我的行为后我发现了一些东西; 我在列表中得到的越低(我与它交互的越多),测量结果就不一致了.例如,如果我将手指向左和向右移动一厘米 - 在列表的最顶部,它会说我移动了,例如,200像素.但是,当我遇到上述问题时,对于相同的 1厘米距离,它可能会低得多,甚至可能为50 .所以窗口没有关闭,因为它不符合我的if条件.
旁注:我已经多次说过,问题在于"与列表进行交互".这意味着:如果我快速从上到下滚动; 没有任何问题; 但是,如果我慢慢地向下工作,也许点击屏幕,滚动打开和关闭,点击按钮listView,其中一些打开一个新的活动(然后回到相同的位置),这是"与"交互".
尝试这个,
gestureDetector = new GestureDetector(getActivity(),
new GestureListener());
View.OnTouchListener gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
listView.onTouchEvent(event);
gestureDetector.onTouchEvent(event);
return true;
}
};
listView.setOnTouchListener(gestureListener);
Run Code Online (Sandbox Code Playgroud)
并进行以下更改
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
编辑: 我看到了应用程序奇妙清单,如果你想模拟该功能,请尝试这种方法,
使用 onInterceptTouch 作为根布局(listView 是其子布局),在此方法中,您必须检查用户是否已滑动,如下所示,
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
if(/* Check your condition here */) {
// User has swiped
return true;
}
}
return false; // return false so that the event will be passed to child views.
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息Android onInterceptTouchEvent
| 归档时间: |
|
| 查看次数: |
3065 次 |
| 最近记录: |