【发布时间】:2011-11-16 16:36:02
【问题描述】:
我需要实现一个画廊,它一次滚动一个项目,并且可以执行“自动滚动”:即每隔几秒钟,它会自动滚动到下一个项目。
根据这个线程:Android: Programmatically animate between images in Gallery widget,我扩展了 Gallery,覆盖了 onFling 以忽略投掷事件,而是模拟向左或向右的 DPAD 箭头,以便一次移动单个项目:
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int kEvent;
if(isScrollingLeft(e1, e2)){ //Check if scrolling left
kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
}
else{ //Otherwise scrolling right
kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
}
onKeyDown(kEvent, null);
return true;
}
这很好用。 对于自动滚动,我创建了一个处理程序并 postDelayed 一个 runnable,它以相同的方式模拟相同的 DPAD 按键:
handler.postDelayed(new Runnable() {
public void run() {
onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
}
}, AUTO_SCROLL_INTERVAL);
但这并没有做任何事情!
我知道 runnable 会以正确的时间间隔按预期执行,因为我记录了它并确认了这一点,但 onKeyDown 不会导致画廊滚动或切换项目。 为什么这会以一种方法而不是另一种方法起作用?我试图改为调用我的 onFling,但无济于事。也尝试dispatchKeyEvent,但没有成功。
我真的需要做这件事,但我也真的很想了解为什么相同的代码在两个不同的地方不会产生相同的结果...这与 Android 视图如何处理输入事件有关吗?我查看了画廊代码以寻找线索,但一无所获!似乎它应该可以工作。
拜托,我很难过……有什么想法吗?
谢谢
【问题讨论】:
标签: android android-widget android-gallery