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()

有谁知道我怎么能做到这一点?

4

5 回答 5

18

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

public boolean onKeyDown(int keyCode, KeyEvent event)

IE

Gallery gallery = ((Gallery) findViewById(R.id.gallery));

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

一件重要的事情 - 此解决方案仅在已创建左侧/右侧的孩子时才有效,这意味着它必须是“可见的”。如果您的图像全屏显示 - 考虑将间距设置为 -1 值。

于 2010-06-18T18:52:12.407 回答
3

您可以使用 dispatchKeyEvent 或直接调用 onFling 进行动画处理。

以下是 dispatchKeyEvent 的示例代码:

KeyEvent evtKey = new KeyEvent(0, KeyEvent.KEYCODE_DPAD_RIGHT);
dispatchKeyEvent(evtKey);
于 2011-02-10T06:17:52.537 回答
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;
        }
    }
}
于 2010-04-28T21:24:19.783 回答
1

最后,我在这个站点上的代码的帮助下编写了我自己版本的 Gallery 小部件。

然后我写了我自己的方法,它使用mFlingRunnable.startUsingDistance(distance);

现在我可以以编程方式为图像之间的画廊设置动画。

于 2010-05-18T11:34:29.327 回答
1

试试这个

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

http://groups.google.com/group/android-developers/browse_thread/thread/9140fd6af3061cdf#

于 2011-06-27T03:58:55.110 回答