Думаю, мне удалось взломать этот орех.Стратегия следующая:
- Все элементы в Галерее должны иметь ViewAnimator в качестве root.
- Расширить стандартную Галерею и перезаписать onKeyDown
- Убедитесь, что onKeyDownиспользуется из Галереи после временного задания, например gallery.onKeyDown (KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent (0,0));
- Когда ключ захвачен в расширенной Галерее, получить текущий вид, который являетсяэкземпляр ViewAnimator, получить следующий вид из адаптера Галереи и создать анимацию для следующего вида
- После завершения анимации вызовите setSelection (getSelectedItemPosition () + 1);(это необходимо проверить на упаковку)
Вот раннее подтверждение концепции, которая работает, хотя в ней отсутствуют некоторые проверки.
<ViewAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/slideshow_animator"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
package com.elsewhat.slideshow.api;
public class CustomGallery extends Gallery implements AnimationListener {
boolean mDoTransition=false;
public CustomGallery(Context context) {
super(context);
}
public CustomGallery(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomGallery(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/*
* (non-Javadoc)
*
* @see android.widget.Gallery#onKeyDown(int, android.view.KeyEvent)
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(mDoTransition==true){
//leave the transition to the super class
return super.onKeyDown(keyCode, event);
}else {
//handle the switch without transition ourselves
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT:
//to be implemented similar as below
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
if (getCount() > 0 && getSelectedItemPosition() < getCount() - 1) {
View currentView = getSelectedView();
View unboundNewView= getAdapter().getView(getSelectedItemPosition()+1, null, null);
ViewAnimator viewAnimator = (ViewAnimator)currentView;
Animation inAnimation = new AlphaAnimation(0.0f, 1.0f);
inAnimation.setDuration(1000);
inAnimation.setAnimationListener(this);
viewAnimator.setInAnimation(inAnimation);
Animation outAnimation = new AlphaAnimation(1.0f, 0.0f);
outAnimation.setDuration(1000);
viewAnimator.setOutAnimation(outAnimation);
viewAnimator.addView(unboundNewView);
viewAnimator.showNext();
}
return true;
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
}
return super.onKeyDown(keyCode, event);
}
}
public void setDoTransition(boolean doTransition){
mDoTransition= doTransition;
}
public boolean getDoTransition(){
return mDoTransition;
}
@Override
public void onAnimationEnd(Animation arg0) {
setSelection(getSelectedItemPosition()+1);
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
}