Android:在Gallery小部件中以编程方式在图像之间进行动画处理

9
注意:自Jellybean起,相册小部件已被弃用。应改用ViewPager
我想以编程方式在画廊小部件中移动图像,并带有动画效果。
我可以使用“setSelection(int position)”方法更改当前显示的图像,但是这不会产生动画效果。然后有“setSelection(int position, bool animate)”但是末尾的额外布尔值似乎没有发挥作用。
Gallery的源代码中,它似乎可以处理DPAD键按下,因此我想到的解决方法是伪造按键按下。例如。
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT))

但是出于某些原因,我无法让它正常工作。有人尝试过这个吗?

我注意到这个小部件中有三种方法 moveNext()movePrevious()scrollToChild() 都是私有的,不能使用。

有人知道我该如何做吗?

5个回答

18

直接调用图库的按键处理程序:

public boolean onKeyDown(int keyCode, KeyEvent event)
即,也就是。
Gallery gallery = ((Gallery) findViewById(R.id.gallery));

gallery.onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, new KeyEvent(0, 0));

一个重要的事情 - 这个解决方案只在左/右侧已经创建的子级可见时才起作用。这意味着它必须是“可见的”。如果您的图像处于全屏状态,请考虑将间距设置为-1。


2
似乎在子类画廊上无法正常工作,有任何想法是怎么回事? - Teo Choong Ping
在我的HTC Desire上似乎完全不起作用。只是将其用作普通的画廊,由按钮触发。 - Kurru
这段代码能用吗?我无法让它移动。我错过了什么吗?另外,我如何使其移动到特定位置,使用它与我的“for”中的pos相同次数? - AnTz

3
您可以使用dispatchKeyEvent或直接调用onFling来进行动画操作。
以下是dispatchKeyEvent的示例代码:
KeyEvent evtKey = new KeyEvent(0, KeyEvent.KEYCODE_DPAD_RIGHT);
dispatchKeyEvent(evtKey);

2

使用 gallery.setSelected(int) 方法。下面是一个简单的例子。


public class Splash extends Activity {

    ArrayList objects = new ArrayList();
    Gallery g;
    int i = 0;
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.photos);
        g = (Gallery) findViewById(R.id.gallery);
        objects.add(getResources().getDrawable(R.drawable.icon));
        objects.add(getResources().getDrawable(R.drawable.icon));
        objects.add(getResources().getDrawable(R.drawable.icon));
        objects.add(getResources().getDrawable(R.drawable.icon));
        objects.add(getResources().getDrawable(R.drawable.icon));
        objects.add(getResources().getDrawable(R.drawable.icon));
        g.setAdapter(new CustomAdapter(this, objects));
        g.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView arg0, View arg1,
                    int arg2, long arg3) {
                Log.i("", "selected " + arg2);
            }

            @Override
            public void onNothingSelected(AdapterView arg0) {}
        });
    }

    @Override
    public void onBackPressed() {
            g.setSelection(i++);
    }

        private class CustomAdapter extends BaseAdapter {

        private Context mCtx;
        private List objects;

        public int getCount() {
            return this.objects.size();
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public CustomAdapter(Context context, ArrayList objects) {
            super();
            mCtx = context;
            this.objects = objects;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView row = (ImageView) convertView;
            if (row == null) {
                row = new ImageView(mCtx);
                row.setBackgroundDrawable(objects.get(position));
            }
            return row;
        }
    }
}

你好 - 感谢您的回复,但是您的解决方案似乎没有在选定图像之间进行更改时提供动画效果。动画是必需的。 - bdls

1
最后,我根据这个网站上的代码,自己编写了一个Gallery小部件的版本。
然后,我又编写了自己的方法,使用了mFlingRunnable.startUsingDistance(distance); 现在,我可以通过编程的方式在图片之间实现动画效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接