滚动图库到下一页

时间:2011-02-18 19:18:52

标签: android gallery

使用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)但画廊中会忽略动画。

3 个答案:

答案 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();
    }