我需要实现一个画廊,它一次滚动一个项目,并且可以执行“自动滚动”:即每隔几秒钟,它会自动滚动到下一个项目。
根据这个线程:Android:以编程方式在图库小部件中的图像之间设置动画 https://stackoverflow.com/questions/2731564/android-programmatically-animate-between-images-in-gallery-widget,我扩展了 Gallery,覆盖了onFling忽略 fling 事件,而是模拟 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 一个可运行程序,它以相同的方式模拟相同的 DPAD 按键:
handler.postDelayed(new Runnable() {
public void run() {
onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
}
}, AUTO_SCROLL_INTERVAL);
但这没有任何作用!
我知道可运行程序会按预期以正确的时间间隔执行,因为我记录了它并确认了这一点,但是按键按下时不会导致图库滚动或切换项目。
为什么这在一种方法中有效,而在另一种方法中无效?我试着打电话给我的onFling相反,却无济于事。也尝试过调度按键事件,但没有运气。
我真的需要让它继续下去,但我也真的很想理解为什么相同的代码在两个不同的地方不会产生相同的结果......这是否与 Android 视图处理输入事件的方式有关?我查看了 Gallery 代码以寻找线索,但一无所获!看起来好像应该有效。
拜托,我很困惑......有什么想法吗?
Thanks