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.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.Toolbar;
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 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.adapter.MovieDetailAdapter;
import com.example.jingbin.cloudreader.bean.MovieDetailBean;
import com.example.jingbin.cloudreader.bean.moviechild.SubjectsBean;
import com.example.jingbin.cloudreader.databinding.ActivityMovieDetailBinding;
import com.example.jingbin.cloudreader.http.HttpClient;
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 com.example.jingbin.cloudreader.view.webview.WebViewActivity;
import jp.wasabeef.glide.transformations.BlurTransformation;
import rx.Observer;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import static com.example.jingbin.cloudreader.view.statusbar.StatusBarUtil.getStatusBarHeight;
/**
* (已可以使用:OneMovieDetailActivity.java 替代)
* 思路:
* 1、透明状态栏(透明titlebar,使背景图上移)
* 2、titlebar底部增加和背景一样的高斯模糊图,并上移图片的高度-titlebar的高度(为了使背景图的底部作为titlebar的背景)
* 3、上移,通过scrollview拿到上移的高度,同时(在背景图的高度内) 调整titlebar的颜色使透明变为不透明,调整背景图的颜色,是不透明变为透明
* 4、下拉,使上面反过来即可
*/
public class MovieDetailActivity extends AppCompatActivity {
private int slidingDistance;
private SubjectsBean subjectsBean;
private ActivityMovieDetailBinding binding;
private String TAG = "---MovieDetailActivity:";
// 这个是高斯图背景的高度
private int imageBgHeight;
// 更多信息url
private String mMoreUrl;
// 影片name
private String mMovieName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_movie_detail);
if (getIntent() != null) {
subjectsBean = (SubjectsBean) getIntent().getSerializableExtra("bean");
}
initSlideShapeTheme();
// 数据配置
setTitleBar();
setHeaderData(subjectsBean);
loadMovieDetail();
}
private void loadMovieDetail() {
// 初始化...
// binding.include.tvOneCity.setText("制片国家/地区:");
// binding.include.tvOneDay.setText("上映日期:");
// binding.tvOneTitle.setText("");
Subscription get = HttpClient.Builder.getDouBanService().getMovieDetail(subjectsBean.getId())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MovieDetailBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(final MovieDetailBean movieDetailBean) {
// 上映日期
binding.include.tvOneDay.setText("上映日期:" + movieDetailBean.getYear());
// 制片国家
binding.include.tvOneCity.setText("制片国家/地区:" + StringFormatUtil.formatGenres(movieDetailBean.getCountries()));
binding.include.setMovieDetailBean(movieDetailBean);
binding.setMovieDetailBean(movieDetailBean);
mMoreUrl = movieDetailBean.getAlt();
mMovieName = movieDetailBean.getTitle();
transformData(movieDetailBean);
}
});
}
/**
* 异步线程转换数据
*/
private void transformData(final MovieDetailBean movieDetailBean) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < movieDetailBean.getDirectors().size(); i++) {
movieDetailBean.getDirectors().get(i).setType("导演");
}
for (int i = 0; i < movieDetailBean.getCasts().size(); i++) {
movieDetailBean.getCasts().get(i).setType("演员");
}
MovieDetailActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
setAdapter(movieDetailBean);
}
});
}
}).start();
}
/**
* 设置导演&演员adapter
*/
private void setAdapter(MovieDetailBean movieDetailBean) {
binding.xrvCast.setVisibility(View.VISIBLE);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(MovieDetailActivity.this);
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
binding.xrvCast.setLayoutManager(mLayoutManager);
binding.xrvCast.setPullRefreshEnabled(false);
binding.xrvCast.setLoadingMoreEnabled(false);
// 需加,不然滑动不流畅
binding.xrvCast.setNestedScrollingEnabled(false);
binding.xrvCast.setHasFixedSize(false);
MovieDetailAdapter mAdapter = new MovieDetailAdapter();
mAdapter.addAll(movieDetailBean.getDirectors());
mAdapter.addAll(movieDetailBean.getCasts());
binding.xrvCast.setAdapter(mAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.movie_detail, menu);
return true;
}
private void setHeaderData(SubjectsBean positionData) {
binding.include.setSubjectsBean(positionData);
// 立即改变UI,防止闪屏
binding.include.executePendingBindings();
}
/**
* toolbar设置
*/
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);
}
// 手动设置才有效果
binding.titleToolBar.setTitleTextAppearance(this, R.style.ToolBar_Title);
binding.titleToolBar.setSubtitleTextAppearance(this, R.style.Toolbar_SubTitle);
binding.titleToolBar.setTitle(subjectsBean.getTitle());
binding.titleToolBar.setSubtitle(String.format("主演:%s", StringFormatUtil.formatName(subjectsBean.getCasts())));
binding.titleToolBar.inflateMenu(R.menu.movie_detail);
binding.titleToolBar.setOverflowIcon(ContextCompat.getDrawable(this, R.drawable.actionbar_more));
binding.titleToolBar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
binding.titleToolBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.actionbar_more:// 更多信息
WebViewActivity.loadUrl(MovieDetailActivity.this,mMoreUrl,mMovieName);
break;
}
return false;
}
});
}
/**
* 初始化滑动渐变
*/
private void initSlideShapeTheme() {
setImgHeaderBg();
// 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;
// 变色
initScrollViewListener();
initNewSlidingParams();
}
/**
* 加载titlebar背景
*/
private void setImgHeaderBg() {
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 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);
}
}
/**
* @param context activity
* @param positionData bean
* @param imageView imageView
*/
public static void start(Activity context, SubjectsBean positionData, ImageView imageView) {
Intent intent = new Intent(context, MovieDetailActivity.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());
}
}