自动滚动图库小部件

时间:2011-11-16 16:36:03

标签: android android-widget android-gallery

我需要实现一个一次滚动一个项目的画廊,它可以进行'自动滚动':即每隔几秒钟,它会自动滚动到下一个项目。

根据这个主题: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 runnable以相同的方式模拟相同的DPAD键按下:

handler.postDelayed(new Runnable() {
    public void run() { 
        onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
    }
}, AUTO_SCROLL_INTERVAL);

但是这没有做任何事情!

我知道runnable以正确的时间间隔按预期执行,因为我记录并确认了这一点,但 onKeyDown 不会导致库滚动或切换项目。 为什么这种方法适用于一种方法而不是另一种方法我试着打电话给我的 onFling ,但无济于事。还尝试 dispatchKeyEvent ,但没有运气。

我真的需要这样做,但我也真的想了解为什么相同的代码在两个不同的地方不能产生相同的结果......这是否与Android视图处理输入事件的方式有关?我查看了图库代码的线索,但一无所获!好像它应该有效。

拜托,我很难过......任何想法?

由于

3 个答案:

答案 0 :(得分:4)

所以,事实证明,我的原始逻辑有效。 实现该逻辑但删除了我的类中的所有其他内容(下面)的自定义库按预期工作,因此它必须是我的类中导致此问题的其他内容。

感谢您的帮助HighFlyer:)

至少我学会了反思......这是Java的一个非常酷的功能。

public class CustomGallery extends Gallery {

    private Handler handler;

    public CustomGallery(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        handler = new Handler();
        postDelayedScrollNext();
    }

    private void postDelayedScrollNext() {
        handler.postDelayed(new Runnable() {
            public void run() {
                postDelayedScrollNext();
                Log.d("CustomGallery", "dpad RIGHT");
                onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
            }
        }, 1000);
    }

    private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {
        return e2.getX() > e1.getX();
    }

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        int kEvent;
        if (isScrollingLeft(e1, e2)) {
            Log.d("CustomGallery", "fling LEFT");
            kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
        } else {
            Log.d("CustomGallery", "fling LEFT");
            kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
        }
        onKeyDown(kEvent, null);
        return true;
    }

答案 1 :(得分:2)

为将来的访问者注意:在这种情况下(全景图库)更好的解决方案是使用ViewPager。它的工作方式类似于图库,但正确实现了setCurrentItem()方法以实现平滑滚动。使用兼容包,它适用于API 4(Android 1.6!)及以上,因此每个人都可以使用它。

答案 2 :(得分:1)

好像你调用了活动的onKeyDown方法,而不是画廊。 试试电话

gallery.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null)

代替。 如果我错了,请纠正我