使用widget.Gallery显示水平滚动的项目列表。我已经在库中实现了分页,其中似乎是标准技术:子类库和实现:
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (velocityX>0) {
onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null);
} else {
onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
}
}
点击图库时,我会淡化下一个和上一个图像按钮。单击这些时,我希望画廊分别动画到下一页/上一页。我试过从我的下一个按钮处理程序调用onKeyDown,但奇怪的是这没有任何效果。
AbsSpinner有setSelection(int position, boolean animate)
但画廊中会忽略动画。
答案 0 :(得分:2)
这是有效的
创建2个图像按钮和图库 例如: nextbtn,backbtn和gall
此处可以使用按钮代码
nextbtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
gall.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
}
});
backbtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
gall.onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null);
}
});
答案 1 :(得分:2)
正是toucan所说的,但要进一步阐述(评论限制太短):
问题似乎是Gallery
如果该位置尚未存在子项,则不允许用户滚动。尝试注入事件时,scrollToChild()
是罪魁祸首:
private boolean scrollToChild(int childPosition) {
View child = getChildAt(childPosition);
if (child != null) {
int distance = getCenterOfGallery() - getCenterOfView(child);
mFlingRunnable.startUsingDistance(distance);
return true;
}
return false;
}
有趣的是,如果你用手指扔画廊,它将导致孩子被创造。然后,如果你放开手指(回到原来的位置),然后然后按下激活onKeyDown
注射的按钮,它将完美地工作 - 因为孩子在那里。
不幸的是,没有真正的解决方案,因为该类中的所有内容都是私有的。唯一的解决方案是在图库中使用setSpacing(-1)
或其他内容,因此始终创建并显示左右子项,但仅在当前所选视图的后面。
作为一个脚注,我真的很困惑为什么一切都是私有的(或者在其他任何Android小部件类中)。这是可以通过一些小的代码更改轻松修复的事情之一。
编辑(2012年8月):供将来参考,而不是尝试将图库用于此类模式(当您希望用户在不同项目之间滑动时,只有其中一个可见),使用Android的compatibility package's ViewPager
class要好得多。在我看来,兼容性包装并不像它应该的那样着名(我需要一段时间才能注意到它)。对于面向Android 2.x +的开发人员来说,这是天赐之物。
答案 2 :(得分:0)
String strMethod = velocityX > 0 ? "movePrevious" : "moveNext";
try {
Method method = Gallery.class.getDeclaredMethod(strMethod, null);
method.setAccessible(true);
method.invoke(this, null);
} catch (Exception e) {
e.printStackTrace();
}