Android: программная анимация между изображениями в виджете галереи
Примечание: с Jellybean виджет галерея устарел. Вместо этого следует использоватьViewPager .
Я хотел бы программно перемещаться между изображениями в виджете галерея, с анимацией.
Я могу изменить текущее изображение, используя метод setSelection(int position)
, однако это не анимирует. Затем есть setSelection(int position, bool animate)
, но дополнительное булево на конце, похоже, ничего не делает.
В источнике галереи оказывается, что он может обрабатывать DPAD нажатия клавиш, так что обходной маневр, о котором я подумал, состоял в том, чтобы подделать нажатия клавиш. Напр..
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT))
Однако я не могу заставить это работать по какой-то причине. Кто-нибудь пробовал это?
Я замечаю три метода виджета, которые я хотел бы использовать moveNext()
, movePrevious()
и scrollToChild()
все частные и непригодные для использования.
5 ответов:
Просто вызовите обработчик нажатия клавиши для галереи напрямую:
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.
Вы можете анимировать, используя dispatchKeyEvent или вызывая onFling напрямую.
Вот пример кода для dispatchKeyEvent:
KeyEvent evtKey = new KeyEvent(0, KeyEvent.KEYCODE_DPAD_RIGHT); dispatchKeyEvent(evtKey);
Используйте галерею.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; } } }
В конце концов я написал свою версию виджета галереи с помощью кода на этом сайте.
Затем я написал свой собственный метод, который использует
Теперь я могу программно анимировать галерею между изображениями.mFlingRunnable.startUsingDistance(distance);
Попробуйте это
Мгаллери.onFling(null, null, velocity, 0);
Http://groups.google.com/group/android-developers/browse_thread/thread/9140fd6af3061cdf#