package com.ximsfei.skindemo; import android.os.Bundle; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CollapsingToolbarLayout; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.View; import android.view.animation.AlphaAnimation; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import skin.support.SkinCompatManager; import skin.support.utils.SkinPreference; /** * Created by ximsfei on 17-3-2. */ public class CollapsingToolbarLayoutActivity extends BaseActivity { // 控制ToolBar的变量 private static final float PERCENTAGE_TO_SHOW_TITLE_AT_TOOLBAR = 0.9f; private static final float PERCENTAGE_TO_HIDE_TITLE_DETAILS = 0.3f; private static final int ALPHA_ANIMATIONS_DURATION = 200; private boolean mIsTheTitleVisible = false; private boolean mIsTheTitleContainerVisible = true; ImageView mIvPlaceholder; // 大图片 LinearLayout mLlTitleContainer; // Title的LinearLayout FrameLayout mFlTitleContainer; // Title的FrameLayout AppBarLayout mAblAppBar; // 整个可以滑动的AppBar TextView mTvToolbarTitle; // 标题栏Title Toolbar mTbToolbar; // 工具栏 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_collapsing_toolbar_layout); mIvPlaceholder = (ImageView) findViewById(R.id.main_iv_placeholder); mLlTitleContainer = (LinearLayout) findViewById(R.id.main_ll_title_container); mFlTitleContainer = (FrameLayout) findViewById(R.id.main_fl_title); mAblAppBar = (AppBarLayout) findViewById(R.id.main_abl_app_bar); mTvToolbarTitle = (TextView) findViewById(R.id.main_tv_toolbar_title); mTbToolbar = (Toolbar) findViewById(R.id.main_tb_toolbar); mTbToolbar.setTitle(""); // AppBar的监听 mAblAppBar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { int maxScroll = appBarLayout.getTotalScrollRange(); float percentage = (float) Math.abs(verticalOffset) / (float) maxScroll; handleAlphaOnTitle(percentage); handleToolbarTitleVisibility(percentage); } }); findViewById(R.id.small_photo).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (TextUtils.isEmpty(SkinPreference.getInstance().getSkinName())) { SkinCompatManager.getInstance().loadSkin("night.skin", null); } else { SkinCompatManager.getInstance().restoreDefaultTheme(); } } }); initParallaxValues(); // 自动滑动效果 } // 设置自动滑动的动画效果 private void initParallaxValues() { CollapsingToolbarLayout.LayoutParams petDetailsLp = (CollapsingToolbarLayout.LayoutParams) mIvPlaceholder.getLayoutParams(); CollapsingToolbarLayout.LayoutParams petBackgroundLp = (CollapsingToolbarLayout.LayoutParams) mFlTitleContainer.getLayoutParams(); petDetailsLp.setParallaxMultiplier(0.9f); petBackgroundLp.setParallaxMultiplier(0.3f); mIvPlaceholder.setLayoutParams(petDetailsLp); mFlTitleContainer.setLayoutParams(petBackgroundLp); } // 处理ToolBar的显示 private void handleToolbarTitleVisibility(float percentage) { if (percentage >= PERCENTAGE_TO_SHOW_TITLE_AT_TOOLBAR) { if (!mIsTheTitleVisible) { startAlphaAnimation(mTvToolbarTitle, ALPHA_ANIMATIONS_DURATION, View.VISIBLE); mIsTheTitleVisible = true; } } else { if (mIsTheTitleVisible) { startAlphaAnimation(mTvToolbarTitle, ALPHA_ANIMATIONS_DURATION, View.INVISIBLE); mIsTheTitleVisible = false; } } } // 控制Title的显示 private void handleAlphaOnTitle(float percentage) { if (percentage >= PERCENTAGE_TO_HIDE_TITLE_DETAILS) { if (mIsTheTitleContainerVisible) { startAlphaAnimation(mLlTitleContainer, ALPHA_ANIMATIONS_DURATION, View.INVISIBLE); mIsTheTitleContainerVisible = false; } } else { if (!mIsTheTitleContainerVisible) { startAlphaAnimation(mLlTitleContainer, ALPHA_ANIMATIONS_DURATION, View.VISIBLE); mIsTheTitleContainerVisible = true; } } } // 设置渐变的动画 public static void startAlphaAnimation(View v, long duration, int visibility) { AlphaAnimation alphaAnimation = (visibility == View.VISIBLE) ? new AlphaAnimation(0f, 1f) : new AlphaAnimation(1f, 0f); alphaAnimation.setDuration(duration); alphaAnimation.setFillAfter(true); v.startAnimation(alphaAnimation); } @Override protected boolean skinStatusBarColorEnable() { return false; } }