Android Apply Palette

Я пытаюсь использовать функцию палитры в дизайне материалов для Android, но у меня возникли некоторые проблемы с ее применением.

Я успешно создал палитру, и теперь я пытаюсь передать палитру в функцию, которая ее применяет.

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я передаю в палитре applyPalette не работает ни один из методов, таких как palette.getDarkMutedColor().getRgb() , palette.getVibrantColor().getRgb() заполняются значениями из палитры.

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

Это функция генератора и функция применения, кто-нибудь может понять, почему это не работает?

Код

private void colorize(Bitmap photo) {
    Palette palette = new Palette.Builder(photo).generate();
    applyPalette(palette);
}

private void applyPalette(Palette palette) {
    getWindow().setBackgroundDrawable(new ColorDrawable(palette.getDarkMutedColor().getRgb()));

    TextView titleView = (TextView) findViewById(R.id.title);
    titleView.setTextColor(palette.getVibrantColor().getRgb());

    TextView descriptionView = (TextView) findViewById(R.id.description);
    descriptionView.setTextColor(palette.getLightVibrantColor().getRgb());

    colorRipple(R.id.info, palette.getDarkMutedColor().getRgb(),
            palette.getDarkVibrantColor().getRgb());
    colorRipple(R.id.star, palette.getMutedColor().getRgb(),
            palette.getVibrantColor().getRgb());

    View infoView = findViewById(R.id.information_container);
    infoView.setBackgroundColor(palette.getLightMutedColor().getRgb());

    AnimatedPathView star = (AnimatedPathView) findViewById(R.id.star_container);
    star.setFillColor(palette.getVibrantColor().getRgb());
    star.setStrokeColor(palette.getLightVibrantColor().getRgb());
}

4 ответа

Решение

Используйте стороннюю библиотеку picassopalette и импортируйте ее в свой проект, а затем используйте следующий код:

try {
        ContextWrapper cw = new ContextWrapper(OtherUserProfileScreenActivity.this);
        Picasso.with(this).load(image + ".jpg").placeholder(R.drawable.ic_loading).error(R.drawable.ic_error).into(imageView, PicassoPalette.with(Image + ".jpg", imageView).use(PicassoPalette.Profile.MUTED_DARK).intoCallBack(new BitmapPalette.CallBack() {
            @Override
            public void onPaletteLoaded(Palette palette) {

                int mutedColor = palette.getMutedColor(R.attr.colorPrimary);
                mCollapsingToolbarLayout.setContentScrimColor(mutedColor);
            }
        }));
    } catch (OutOfMemoryError e) {
        e.printStackTrace();
        System.gc();
    }

Вы пытались синхронно. Поэтому я думаю, что приведенный ниже код решит вашу проблему (асинхронно).

private void colorize(Bitmap photo) {   
Palette.from(photo).generate(new Palette.PaletteAsyncListener() {
            @Override
            public void onGenerated(Palette palette) {
                applyPalette(palette);
            }
        });
}

Из документации, все звонки, которые вы используете с Palette уже возвращает значение RGB, но требует передачи цвета по умолчанию. Возможно, вы хотели использовать те, которые возвращают образец цвета? Например, вместо этого palette.getVibrantColor().getRgb() вы бы вместо этого сделали это palette.getVibrantSwatch().getRgb() вместо. Замените все ваши вызовы get Color соответствующими вызовами get Swatch ().

Кроме того, убедитесь, что у вас есть import android.support.v7.graphics.Palette в вашем импорте и что вы включаете compile 'com.android.support:palette-v7:22.1.0' в ваших зависимостях. Версия 22.1.0 является минимальной, как вы используете Palette.Builder,

Во-первых, я не знаю, почему вы не получили ошибку при написании

palette.getVibrantColor().getRgb()

Я предполагаю, что вы не получили ошибку, поэтому вы должны использовать старую библиотеку. Как и в обновленном, он принимает один параметр в качестве значения цвета по умолчанию. Чтобы извлечь RGB лучше, это получить Palette.Swatch объект и получить значения RGB. Я создал небольшое работающее простое приложение, чтобы продемонстрировать, как использовать улучшенную библиотеку. Вы можете проверить это здесь. Надеюсь это поможет.

Другие вопросы по тегам