package com.example.jingbin.cloudreader.ui.one; import android.app.Activity; import android.content.Intent; import android.databinding.DataBindingUtil; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.drawable.GlideDrawable; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import com.example.jingbin.cloudreader.R; import com.example.jingbin.cloudreader.bean.moviechild.SubjectsBean; import com.example.jingbin.cloudreader.databinding.ActivitySlideShadeViewBinding; import com.example.jingbin.cloudreader.utils.CommonUtils; import com.example.jingbin.cloudreader.utils.DebugUtil; import com.example.jingbin.cloudreader.utils.StringFormatUtil; import com.example.jingbin.cloudreader.view.MyNestedScrollView; import com.example.jingbin.cloudreader.view.statusbar.StatusBarUtil; import com.example.jingbin.cloudreader.view.test.StatusBarUtils; import jp.wasabeef.glide.transformations.BlurTransformation; import static com.example.jingbin.cloudreader.view.statusbar.StatusBarUtil.getStatusBarHeight; /** * 思路: * 1、透明状态栏(透明titlebar,使背景图上移) * 2、titlebar底部增加和背景一样的高斯模糊图,并上移图片的高度-titlebar的高度(为了使背景图的底部作为titlebar的背景) * 3、上移,通过scrollview拿到上移的高度,同时(在背景图的高度内) 调整titlebar的颜色使透明变为不透明,调整背景图的颜色,是不透明变为透明 * 4、下拉,使上面反过来即可 */ public class SlideShadeViewActivity extends AppCompatActivity { private int slidingDistance; private SubjectsBean subjectsBean; private ActivitySlideShadeViewBinding binding; private String TAG = "---SlideShadeView:"; // 这个是高斯图背景的高度 private int imageBgHeight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_slide_shade_view); if (getIntent() != null) { subjectsBean = (SubjectsBean) getIntent().getSerializableExtra("bean"); } setData(); // toolbar 的高 int toolbarHeight = binding.titleToolBar.getLayoutParams().height; Log.i(TAG, "toolbar height:" + toolbarHeight); final int headerBgHeight = toolbarHeight + getStatusBarHeight(this); Log.i(TAG, "headerBgHeight:" + headerBgHeight); // 使背景图向上移动到图片的最低端,保留(titlebar+statusbar)的高度 ViewGroup.LayoutParams params = binding.ivTitleHeadBg.getLayoutParams(); ViewGroup.MarginLayoutParams ivTitleHeadBgParams = (ViewGroup.MarginLayoutParams) binding.ivTitleHeadBg.getLayoutParams(); int marginTop = params.height - headerBgHeight; ivTitleHeadBgParams.setMargins(0, -marginTop, 0, 0); binding.ivTitleHeadBg.setImageAlpha(0); StatusBarUtils.setTranslucentImageHeader(this, 0, binding.titleToolBar); // 上移背景图片,使空白状态栏消失 if (binding.include.imgItemBg != null) { ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) binding.include.imgItemBg.getLayoutParams(); layoutParams.setMargins(0, -StatusBarUtil.getStatusBarHeight(this), 0, 0); } ViewGroup.LayoutParams imgItemBgparams = binding.include.imgItemBg.getLayoutParams(); // 获得高斯图背景的高度 imageBgHeight = imgItemBgparams.height; // 数据配置 setTitleBar(); setHeaderData(subjectsBean); // 变色 initScrollViewListener(); initNewSlidingParams(); } /** * 加载titlebar背景 */ private void setData() { if (subjectsBean != null) { // 高斯模糊背景 原来 参数:12,5 23,4 Glide.with(this).load(subjectsBean.getImages().getLarge()) .error(R.drawable.stackblur_default) .bitmapTransform(new BlurTransformation(this, 23, 4)).listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { binding.titleToolBar.setBackgroundColor(Color.TRANSPARENT); binding.ivTitleHeadBg.setImageAlpha(0); binding.ivTitleHeadBg.setVisibility(View.VISIBLE); return false; } }).into(binding.ivTitleHeadBg); } } private void setHeaderData(SubjectsBean positionData) { binding.include.setSubjectsBean(positionData); } private void setTitleBar() { setSupportActionBar(binding.titleToolBar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { //去除默认Title显示 actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeAsUpIndicator(R.drawable.icon_back); } // title binding.tvTitle.setText(subjectsBean.getTitle()); // 副标题 binding.tvSubtitle.setText("主演:" + StringFormatUtil.formatName(subjectsBean.getCasts())); binding.titleToolBar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); } // private void initScrollViewListener() { // 为了兼容23以下 binding.nsvScrollview.setOnScrollChangeListener(new MyNestedScrollView.ScrollInterface() { @Override public void onScrollChange(int scrollX, int scrollY, int oldScrollX, int oldScrollY) { scrollChangeHeader(scrollY); } }); } private void initNewSlidingParams() { int titleBarAndStatusHeight = (int) (CommonUtils.getDimens(R.dimen.nav_bar_height) + getStatusBarHeight(this)); slidingDistance = imageBgHeight - titleBarAndStatusHeight - (int) (CommonUtils.getDimens(R.dimen.nav_bar_height_more)); } /** * 根据页面滑动距离改变Header方法 */ private void scrollChangeHeader(int scrolledY) { DebugUtil.error("---scrolledY: " + scrolledY); DebugUtil.error("-----slidingDistance: " + slidingDistance); if (scrolledY < 0) { scrolledY = 0; } float alpha = Math.abs(scrolledY) * 1.0f / (slidingDistance); DebugUtil.error("----alpha: " + alpha); Drawable drawable = binding.ivTitleHeadBg.getDrawable(); if (scrolledY <= slidingDistance) { // title部分的渐变 drawable.mutate().setAlpha((int) (alpha * 255)); binding.ivTitleHeadBg.setImageDrawable(drawable); } else { drawable.mutate().setAlpha(255); binding.ivTitleHeadBg.setImageDrawable(drawable); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.slide, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_search: Toast.makeText(this, "搜索", Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } } /** * @param context activity * @param positionData bean * @param imageView imageView */ public static void start(Activity context, SubjectsBean positionData, ImageView imageView) { Intent intent = new Intent(context, SlideShadeViewActivity.class); intent.putExtra("bean", positionData); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(context, imageView, CommonUtils.getString(R.string.transition_movie_img));//与xml文件对应 ActivityCompat.startActivity(context, intent, options.toBundle()); } }