如何以编程方式滚动动画

时间:2010-09-26 20:50:16

标签: android animation gallery

我正在尝试以编程方式为图库实现滚动动画。

尝试使用setSelection(int pos, Boolean animate)并且无效。

无论如何都要覆盖setSelection()方法。

5 个答案:

答案 0 :(得分:12)

刚才我遇到了这个问题。我只需移动画廊的一个元素,所以对我来说最好的解决方案是模拟按键事件

myGallery.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);

myGallery.onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null);

答案 1 :(得分:6)

Gallery.setSelection(int position,boolean animate);

参考以下网址: http://groups.google.com/group/android-developers/browse_thread/thread/9140fd6af3061cdf/7f89e53ae53e455b?lnk=gst&q=setselection#7f89e53ae53e455b

溶液: 如果您还在寻找,我可以为您提供两种可能的解决方案 有点不愉快:

(1)你可以让画廊以选定的速度进行投掷,因此:

myGallery.onFling(null,null,velocity,0);

通过调整速度,您可以设置值以移动选区 两个方向中的一个或两个。作为画廊的自我中心,你做到了 不需要完全正确的目的地。

(2)由于Gallery源可用,您可以修改它 实现自己的图库。它看起来不像你需要添加 很多代码能够控制投掷以便以你选择的结束 选择。

我以为我必须做(2),但发现我可以逃脱 (1)为我的问题。

答案 2 :(得分:6)

基于Kurru对模拟点击下一个或上一个视图的出色思考。

//scroll forward or backward
private void scroll(int type){
    View selectedV = mG.getSelectedView();
    int idx = mG.indexOfChild(selectedV);
    switch(type){
        case FORWARD:
    default:
        if(idx<mG.getChildCount()-1)
            idx++;
        break;
    case BACKWARD:
        if(idx>0)
            idx--;          
        break;
    }
    //now scrolled view's child idx in gallery is gotten
    View nextView = mG.getChildAt(idx);
    //(x,y) in scrolled view is gotten
    int x = nextView.getLeft()+nextView.getWidth()/2;
    int y = nextView.getTop()+nextView.getHeight()/2;
    String out = String.format("x=%d, y=%d", x, y);
    Log.i(TAG+".scroll", out);

    //Kurru's simulating clicking view
    MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0);
    mG.onDown(event); 
    boolean res = mG.onSingleTapUp(null);
    Log.i(TAG+".scroll", "onSingleTapUp return =" + res);       
}

答案 3 :(得分:2)

我正在查看图库来源,看看我是否可以获得此功能。看起来这个代码有可能实现。但是在我开始工作之前我放弃了。好像我没有传递正确的坐标所以res总是返回false。如果有效,将返回true。

只是在这里张贴这个,以防其他人想要解决这个问题! (如果您管理它,请发布您的解决方案!)

Rect rect = new Rect();
gallery.getHitRect(rect);


int x = rect.centerX()+getWindowManager().getDefaultDisplay().getWidth();
int y = rect.centerY();

MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0);
timesGallery.onDown(event);
boolean res = timesGallery.onSingleTapUp(null);

答案 4 :(得分:2)

我对“Kurru”给出的代码做了一点改动。现在正在运作

Rect rect = new Rect();
    gallery.getHitRect(rect);

    int width = Math.abs(rect.width());
    if(!isForwardScroll){
        width = width * -1;
    }
    int x = rect.centerX()+width/2;
    int y = rect.centerY();

    MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0);
    gallery.onDown(event);
    boolean res = gallery.onSingleTapUp(null);