Android: программно анимировать между изображениями в виджете Галерея - PullRequest
9 голосов
/ 28 апреля 2010

Примечание. Начиная с 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 голосов
/ 18 июня 2010

Просто вызовите обработчик нажатия клавиш для галереи напрямую:

public boolean onKeyDown(int keyCode, KeyEvent event)

* 1004 т.е. *

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

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

Одна важная вещь - это решение работает, только если дочерний элемент, который находится слева / справа, уже был создан, что означает, что он должен быть «видимым». Если у вас есть изображение в полноэкранном режиме - рассмотрите возможность установки интервала в значение -1. ​​

3 голосов
/ 10 февраля 2011

Вы можете анимировать, используя dispatchKeyEvent или напрямую вызывая onFling.

Вот пример кода для dispatchKeyEvent:

KeyEvent evtKey = new KeyEvent(0, KeyEvent.KEYCODE_DPAD_RIGHT);
dispatchKeyEvent(evtKey);
2 голосов
/ 29 апреля 2010

Использовать 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;
        }
    }
}
1 голос
/ 27 июня 2011

Попробуйте это

mGallery.onFling (ноль, ноль, скорость, 0);

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

1 голос
/ 18 мая 2010

В итоге я написал собственную версию виджета Галерея с помощью кода на этом сайте .

Затем я написал свой собственный метод, который использует mFlingRunnable.startUsingDistance(distance);

Теперь я могу программно анимировать галерею между изображениями.

...