Android 将“多媒体资料”滚动到下一页

Android 将“多媒体资料”滚动到下一页,android,gallery,Android,Gallery,使用widget.Gallery显示项目的水平滚动列表。我已经在gallery中使用标准技术实现了分页:子类gallery和实现: @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (velocityX>0) { onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, nul

使用widget.Gallery显示项目的水平滚动列表。我已经在gallery中使用标准技术实现了分页:子类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位置,布尔动画)
但在Gallery中忽略动画。

这是可行的

创建2个图像按钮和图库 如: 下一个、下一个和下一个

按钮代码可在此查看

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);
    }
});         

toucan说的正是,但要进一步详细说明(评论限制太短):

问题似乎在于,如果在该位置还没有子对象,则
不允许用户滚动<代码>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
注射,它将完美地工作——因为孩子就在那里

不幸的是,没有真正的解决方案,因为该类中的所有内容都是私有的。唯一的解决方案是使用
setspace(-1)
或图库中的某个工具,以便始终创建并显示左、右子对象,但就在当前选定视图的后面

作为一个脚注,我真的很困惑,为什么这个类中的所有东西都是私有的(或者在任何其他Android widget类中都是私有的)。这是一个可以通过一些小的代码更改轻松修复的问题


编辑(2012年8月):作为将来的参考,而不是尝试使用图库来处理这种模式(当您希望用户在不同项目之间滑动,而只有一个项目可见时),最好使用Android的图库。在我看来,兼容性软件包并没有它应有的那么出名(我花了一段时间才注意到它)。对于针对Android 2.x+的开发人员来说,这简直是天赐良机。

你确定要在UIThread上调用这些方法吗?是的,它们是从主线程上的视图onClick callback中调用的。如果我在活动中放置一个标准库,并在emulator中运行它,仿真器的左右键似乎也没有效果?这只是当库中的项目太宽,以至于屏幕上看不到其他项目时才会出现问题。设置较小的项目宽度可以解决问题;但这也应该适用于全幅项目…这仅适用于画廊在左侧或右侧分配了项目的情况。如果多媒体资料中的项目为全屏(或更多),则多媒体资料不会分配任何项目,模拟按键将被忽略
    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();
    }