package com.pandaq.pandaeye.utils; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.app.Activity; import android.content.res.ColorStateList; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.annotation.Nullable; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.FloatingActionButton; import android.support.v7.graphics.Palette; import android.support.v7.widget.Toolbar; import android.util.TypedValue; import android.view.animation.AccelerateInterpolator; import android.widget.ImageView; import com.pandaq.pandaeye.R; import com.pandaq.pandaeye.BaseActivity; import com.squareup.picasso.Picasso; import com.squareup.picasso.Target; /** * Created by PandaQ on 2017/3/3. * picasso 图片加载监听,并获取主题色 */ public class PicassoTarget implements Target { private static final float SCRIM_ADJUSTMENT = 0.075f; private Activity mActivity; private ImageView mImageView; private CollapsingToolbarLayout mToolbarLayout; private Toolbar mToolbar; private FloatingActionButton mFloatingActionButton; public PicassoTarget(Activity activity, ImageView imageView, Toolbar toolbar) { this(activity, imageView, null, toolbar, null); } public PicassoTarget(Activity activity, ImageView imageView, @Nullable CollapsingToolbarLayout toolbarLayout, Toolbar toolbar, @Nullable FloatingActionButton fab) { mActivity = activity; mImageView = imageView; mToolbarLayout = toolbarLayout; mToolbar = toolbar; mFloatingActionButton = fab; } @Override public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { mImageView.setImageBitmap(bitmap); final int twentyFourDip = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, mActivity.getResources().getDisplayMetrics()); assert bitmap != null; Palette.from(bitmap) .maximumColorCount(16) .clearFilters() .setRegion(0, 0, bitmap.getWidth() - 1, twentyFourDip) .generate(new Palette.PaletteAsyncListener() { @TargetApi(Build.VERSION_CODES.M) @Override public void onGenerated(Palette palette) { boolean isDark; int lightness = ColorUtils.isDark(palette); if (lightness == ColorUtils.LIGHTNESS_UNKNOWN) { isDark = ColorUtils.isDark(bitmap, bitmap.getWidth() / 2, 0); } else { isDark = lightness == ColorUtils.IS_DARK; } // color the status bar. Set a complementary dark color on L, // light or dark color on M (with matching status bar icons) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { int statusBarColor = mActivity.getWindow().getStatusBarColor(); final Palette.Swatch topColor = ColorUtils.getMostPopulousSwatch(palette); if (topColor != null && (isDark || Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)) { statusBarColor = ColorUtils.scrimify(topColor.getRgb(), isDark, SCRIM_ADJUSTMENT); // set a light status bar on M+ if (!isDark && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ViewUtils.setLightStatusBar(mImageView); } } if (statusBarColor != mActivity.getWindow().getStatusBarColor()) { ValueAnimator statusBarColorAnim = ValueAnimator.ofArgb( mActivity.getWindow().getStatusBarColor(), statusBarColor); statusBarColorAnim.addUpdateListener(new ValueAnimator .AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mActivity.getWindow().setStatusBarColor((int) animation.getAnimatedValue()); BaseActivity.currentStatusColor = (int) animation.getAnimatedValue(); } }); statusBarColorAnim.setDuration(500L); statusBarColorAnim.setInterpolator( new AccelerateInterpolator()); statusBarColorAnim.start(); if (ColorUtils.compareColors(Color.WHITE, statusBarColor) > 0.8) { statusBarColor = ColorUtils.blendColors(statusBarColor, mActivity.getResources().getColor(R.color.black_000000), 0.2f); } if (mToolbarLayout != null) { mToolbarLayout.setContentScrimColor(statusBarColor); mToolbar.setBackgroundColor(ColorUtils.modifyAlpha(statusBarColor, 0.5f)); } else { //无toolbarlayout时保持toolbar颜色与状态栏一致 mToolbar.setBackgroundColor(ColorUtils.modifyAlpha(statusBarColor, 0.8f)); } if (mFloatingActionButton != null) { mFloatingActionButton.setBackgroundTintList(ColorStateList.valueOf(statusBarColor)); } } } } }); } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } }