2015-12-20 4 views
1

В моем приложении у меня есть ViewPager, который содержит изображения. Когда пользователь прокручивает изображения, появляется цветовая анимация, которая переводит цвет панели действия и цвет строки состояния между яркими цветами палитры двух растровых изображений. Проблема, которую я вижу, заключается в том, что, хотя она отлично работает, она становится очень изменчивой при выборе больших изображений.Использование асинхронного генератора палитр Android для анимации перехода цвета

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    Palette paletteBefore = Palette.from(imagePagerAdapter.bitmap.get(position)).generate(); 
    Palette paletteAfter = Palette.from(imagePagerAdapter.bitmap.get(position + 1)).generate(); 

    //Using this to get the average color between the two palette colors at the current position offset. 
    int color = (Integer) new ArgbEvaluator().evaluate(positionOffset, paletteBefore.getVibrantColor(Color.parseColor("#2196F3")), paletteAfter.getVibrantColor(Color.parseColor("#2196F3"))); 
    int darkColor = (Integer) new ArgbEvaluator().evaluate(positionOffset, paletteBefore.getDarkVibrantColor(Color.parseColor("#1976D2")), paletteAfter.getDarkVibrantColor(Color.parseColor("#1976D2"))); 
    getSupportActionBar().setBackgroundDrawable(new ColorDrawable(color)); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
     getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
     getWindow().setStatusBarColor(darkColor); 
    } 
} 

Я знаю, что есть встроенный асинхронный метод, который создает палитру в фоновом потоке, но я не могу получить доступ к сгенерированной палитрой:

Palette.from(imagePagerAdapter.bitmap.get(position)).generate(new Palette.PaletteAsyncListener() { 
    @Override 
    public void onGenerated(Palette p) { 
     paletteBefore = p; //Variable "paletteBefore" is accessed from within class, needs to be declared final 
    } 
}); 

Даже если я создаю глобальный переменной, чтобы удерживать объект палитры, он всегда заканчивается нулевым. Я понятия не имею, как это решить, любые идеи?

ответ

0

Как вы сказали, это генерирует их асинхронно.

Вы не можете гарантировать, что обе палитры будут созданы одновременно, как раз вовремя, чтобы сгенерировать ваши цвета.

Принятое время будет зависеть от размера изображения.

я бы переместить все поколения палитры из onPageScrolled()

Попробуйте создать палитры, как только битовая карта доступна из каждого вашего фрагмента/представления

Таким образом, там может быть больше шансов имея их к моменту прокрутки пользователя.

 Смежные вопросы

  • Нет связанных вопросов^_^