Галерея Android - используйте различные переходы, такие как постепенное появление - PullRequest
2 голосов
/ 24 ноября 2011

Я использую контроллер пользовательского интерфейса Gallery для создания полноэкранного слайд-шоу. Это настроено для отображения только на фото в то время.

Стандартным переходом является выдвижение старой фотографии и вставка новой. Это гладко и хорошо работает на большинстве платформ, но у меня есть проблемы с производительностью на других (с очень высоким разрешением).

Мой обходной путь - использовать другой переход, предпочтительнее постепенное исчезновение и постепенное появление.

Я уже расширил контроль галереи и перезаписал Метод onKeyDown.

Используя setSelection, я могу пропустить переход по умолчанию, но не могу включить свой переход.

Кто-нибудь добавил другой переход к компоненту Галерея?

Есть ли другой компонент, который мог бы дать мне лучшие результаты?

Галерея источника: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/widget/Gallery.java

1 Ответ

1 голос
/ 27 ноября 2011

Думаю, мне удалось взломать этот орех.Стратегия следующая:

  1. Все элементы в Галерее должны иметь ViewAnimator в качестве root.
  2. Расширить стандартную Галерею и перезаписать onKeyDown
  3. Убедитесь, что onKeyDownиспользуется из Галереи после временного задания, например gallery.onKeyDown (KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent (0,0));
  4. Когда ключ захвачен в расширенной Галерее, получить текущий вид, который являетсяэкземпляр ViewAnimator, получить следующий вид из адаптера Галереи и создать анимацию для следующего вида
  5. После завершения анимации вызовите 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

}

}
...