package licola.demo.com.huabandemo.Module.ImageDetail; import android.animation.Animator; import android.animation.ObjectAnimator; import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.FloatingActionButton; import android.support.graphics.drawable.AnimatedVectorDrawableCompat; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import com.facebook.drawee.controller.BaseControllerListener; import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.imagepipeline.image.ImageInfo; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import java.util.concurrent.TimeUnit; import butterknife.BindString; import butterknife.BindView; import licola.demo.com.huabandemo.API.Dialog.OnGatherDialogInteractionListener; import licola.demo.com.huabandemo.API.Fragment.OnImageDetailFragmentInteractionListener; import licola.demo.com.huabandemo.API.HttpsAPI.OperateAPI; import licola.demo.com.huabandemo.HttpUtils.ImageLoad.ImageLoadBuilder; import licola.demo.com.huabandemo.Util.AnimatorUtils; import licola.demo.com.huabandemo.Base.BaseActivity; import licola.demo.com.huabandemo.Entity.PinsMainEntity; import licola.demo.com.huabandemo.HttpUtils.ImageLoad.ImageLoadFresco; import licola.demo.com.huabandemo.HttpUtils.RetrofitClient; import licola.demo.com.huabandemo.Module.BoardDetail.BoardDetailActivity; import licola.demo.com.huabandemo.Module.Main.MainActivity; import licola.demo.com.huabandemo.Module.Type.TypeActivity; import licola.demo.com.huabandemo.Module.User.UserActivity; import licola.demo.com.huabandemo.Observable.MyRxObservable; import licola.demo.com.huabandemo.R; import licola.demo.com.huabandemo.Service.DownloadService; import licola.demo.com.huabandemo.Util.CompatUtils; import licola.demo.com.huabandemo.Util.Constant; import licola.demo.com.huabandemo.Util.IntentUtils; import licola.demo.com.huabandemo.Util.Logger; import licola.demo.com.huabandemo.Util.SPUtils; import licola.demo.com.huabandemo.Util.Utils; import licola.demo.com.huabandemo.Widget.MyDialog.GatherDialogFragment; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; public class ImageDetailActivity extends BaseActivity implements OnImageDetailFragmentInteractionListener, OnGatherDialogInteractionListener { //定义调用ImageDetailActivity的类 来自什么类型 在结束作为判断条件 private static final String KEYPARCELABLE = "Parcelable"; private int mActionFrom; public static final String ACTION_KEY = "key";//key值 public static final int ACTION_DEFAULT = -1;//默认值 public static final int ACTION_THIS = 0;//来自自己的跳转 public static final int ACTION_MAIN = 1;//来自主界面的跳转 public static final int ACTION_MODULE = 2;//来自模块界面的跳转 public static final int ACTION_BOARD = 3;//来自画板界面的跳转 public static final int ACTION_ATTENTION = 4;//来自我的关注界面的跳转 public static final int ACTION_SEARCH = 5;//来自搜索界面的跳转 Drawable mDrawableCancel; Drawable mDrawableRefresh; //小图的后缀 @BindString(R.string.url_image_big) String mFormatImageUrlBig; //大图的后缀 @BindString(R.string.url_image_general) String mFormatImageGeneral; @BindView(R.id.appbar_image_detail) AppBarLayout mAppBar; @BindView(R.id.colltoolbar_layout) CollapsingToolbarLayout mCollapsingToolbar; @BindView(R.id.toolbar_image) Toolbar toolbar; @BindView(R.id.fab_image_detail) FloatingActionButton mFabOperate; @BindView(R.id.img_image_big) SimpleDraweeView mImgImageBig; public PinsMainEntity mPinsBean; public String mImageUrl;//图片地址 public String mImageType;//图片类型 public String mPinsId; private boolean isLike = false;//该图片是否被喜欢操作 默认false 没有被操作过 private boolean isGathered = false;//该图片是否被采集过 private String[] mBoardIdArray; @Override protected int getLayoutId() { return R.layout.activity_image_detail; } @Override protected String getTAG() { return this.toString(); } public static void launch(Activity activity) { Intent intent = new Intent(activity, ImageDetailActivity.class); activity.startActivity(intent); } public static void launch(Activity activity, int action) { Intent intent = new Intent(activity, ImageDetailActivity.class); intent.putExtra(ACTION_KEY, action); activity.startActivity(intent); } @Override protected boolean isTranslucentStatusBar() { return false; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EventBus.getDefault().register(this);//注册 mActionFrom = getIntent().getIntExtra(ACTION_KEY, ACTION_DEFAULT); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowTitleEnabled(false); // mCollapsingToolbar.setExpandedTitleColor(Color.TRANSPARENT);//设置打开时的文字颜色 recoverData(savedInstanceState);//恢复数据 mDrawableCancel= CompatUtils.getTintDrawable(mContext,R.drawable.ic_cancel_black_24dp,Color.GRAY); mDrawableRefresh=CompatUtils.getTintDrawable(mContext,R.drawable.ic_refresh_black_24dp,Color.GRAY); mImageUrl = mPinsBean.getFile().getKey(); mImageType = mPinsBean.getFile().getType(); mPinsId = String.valueOf(mPinsBean.getPin_id()); isLike = mPinsBean.isLiked(); //设置图片空间的宽高比 int width = mPinsBean.getFile().getWidth(); int height = mPinsBean.getFile().getHeight(); mImgImageBig.setAspectRatio(Utils.getAspectRatio(width, height)); Logger.d("aspect=" + mImgImageBig.getAspectRatio()); getSupportFragmentManager(). beginTransaction().replace(R.id.framelayout_info_recycler, ImageDetailFragment.newInstance(mPinsId)).commit(); } private void recoverData(Bundle savedInstanceState) { Logger.d(TAG); //被销毁之后 恢复数据 if (savedInstanceState != null) { if ((savedInstanceState.getParcelable(KEYPARCELABLE) != null) && (mPinsBean == null)) { Logger.d(); mPinsBean = savedInstanceState.getParcelable(KEYPARCELABLE); } } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Logger.d(TAG); outState.putParcelable(KEYPARCELABLE, mPinsBean); } @Override protected void initResAndListener() { mFabOperate.setImageResource(R.drawable.ic_camera_white_24dp); mFabOperate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showGatherDialog(); // boolean isEquals=RetrofitClient.retrofit()==RetrofitClient.retrofit(); // Logger.d("isEquals="+isEquals); } }); mImgImageBig.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Logger.d(); // ImageScaleDialogFragment fragment = ImageScaleDialogFragment.create(); // fragment.show(getSupportFragmentManager(), null); } }); } /** * 创建对话框 */ private void showGatherDialog() { String boardTitleArray = (String) SPUtils.get(mContext, Constant.BOARDTILTARRAY, ""); String mBoardId = (String) SPUtils.get(mContext, Constant.BOARDIDARRAY, ""); Logger.d("title is " + boardTitleArray); String[] array = boardTitleArray != null ? boardTitleArray.split(Constant.SEPARATECOMMA) : new String[0]; mBoardIdArray = mBoardId != null ? mBoardId.split(Constant.SEPARATECOMMA) : new String[0]; GatherDialogFragment fragment = GatherDialogFragment.create(mAuthorization, mPinsId, mPinsBean.getRaw_text(), array); fragment.show(getSupportFragmentManager(), null); } @Override protected void onResume() { super.onResume(); showImage();//显示图片 } /** * 显示图片的操作 * 主要逻辑 根据图片类型 git图 使fab旋转 表示loading */ private void showImage() { final ObjectAnimator objectAnimator; if (Utils.checkIsGif(mImageType)) { objectAnimator = AnimatorUtils.getRotationFS(mFabOperate); objectAnimator.start(); } else { objectAnimator = null; } String url = String.format(mFormatImageUrlBig, mImageUrl); String url_low = String.format(mFormatImageGeneral, mImageUrl); //加载大图 ImageLoadBuilder.Start(mContext, mImgImageBig, url) // .setActualImageScaleType(ScalingUtils.ScaleType.FOCUS_CROP) .setUrlLow(url_low) .setRetryImage(mDrawableRefresh) .setFailureImage(mDrawableCancel) .setControllerListener(new BaseControllerListener<ImageInfo>() { @Override public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { //图片加载成功回调 super.onFinalImageSet(id, imageInfo, animatable); Logger.d("onFinalImageSet " + Thread.currentThread().toString()); if (animatable != null) { animatable.start(); } if (objectAnimator != null && objectAnimator.isRunning()) { mImgImageBig.postDelayed(new Runnable() { @Override public void run() { objectAnimator.cancel(); } }, 600); } } @Override public void onSubmit(String id, Object callerContext) { super.onSubmit(id, callerContext); //提交申请回调 相当于开始 Logger.d("onSubmit " + Thread.currentThread().toString()); } @Override public void onFailure(String id, Throwable throwable) { //失败的回调 super.onFailure(id, throwable); Logger.d(throwable.toString()); } }) .build(); } @Override public boolean onCreateOptionsMenu(Menu menu) { //创建menu视图 super.onCreateOptionsMenu(menu); Logger.d(); getMenuInflater().inflate(R.menu.menu_image_detail, menu); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { //onCreateOptionsMenu的后续 Logger.d(); //menu文件中默认 选择没有选中的drawable setIconDynamic(menu.findItem(R.id.action_like), isLike); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Logger.d("id=" + item.getItemId()); int id = item.getItemId(); switch (id) { case android.R.id.home: actionHome(mActionFrom);//根据action值 选择向上键的 操作结果 break; case R.id.action_like: actionLike(item); break; case R.id.action_download: actionDownload(item); break; case R.id.action_gather: showGatherDialog(); break; } // boolean Return false to allow normal menu processing to // proceed, true to consume it here. // false:允许继续事件传递 true:就自己消耗事件 不再传递 return true; } private void actionDownload(MenuItem item) { Logger.d(); DownloadService.launch(this, mImageUrl, mImageType); } /** * 设置动态的icon图标 反向设置 * 如果为true 显示undo图片 * 为false 显示do图标 * 所以传入当前状态值就可以 内部已经做判断 * * @param item * @param isLike */ private void setIconDynamic(MenuItem item, boolean isLike) { AnimatedVectorDrawableCompat drawableCompat; drawableCompat = AnimatedVectorDrawableCompat.create(mContext, isLike ? R.drawable.drawable_animation_favorite_undo : R.drawable.drawable_animation_favorite_do); item.setIcon(drawableCompat); } private void actionHome(int mActionFrom) { switch (mActionFrom) { case ACTION_MAIN: //在maxifest已经定义 默认处理 MainActivity.launch(this); break; case ACTION_MODULE: TypeActivity.launch(this, Intent.FLAG_ACTIVITY_CLEAR_TOP); break; case ACTION_BOARD: // BoardDetailActivity.launch(this, ); break; } } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } @Subscribe(sticky = true) public void onEventReceiveBean(PinsMainEntity bean) { //接受EvenBus传过来的数据 Logger.d(TAG + " receive bean"); this.mPinsBean = bean; } @Override public void onClickPinsItemImage(PinsMainEntity bean, View view) { ImageDetailActivity.launch(this, mActionFrom); } @Override public void onClickPinsItemText(PinsMainEntity bean, View view) { ImageDetailActivity.launch(this, mActionFrom); } @Override public void onClickBoardField(String key, String title) { BoardDetailActivity.launch(this, key, title); } @Override public void onClickUserField(String key, String title) { UserActivity.launch(this, key, title); } /** * 警告:用户可能没有任何应用处理您发送到 startActivity() 的隐式 Intent。 * 如果出现这种情况,则调用将会失败,且应用会崩溃。 * 要验证 Activity 是否会接收 Intent,请对 Intent 对象调用 resolveActivity()。 * 如果结果为非空,则至少有一个应用能够处理该 Intent,且可以安全调用 startActivity()。 * 如果结果为空,则不应使用该 Intent。如有可能,您应禁用发出该 Intent 的功能。 * * @param link */ @Override public void onClickImageLink(String link) { //点击图片链接的回调 //打开选择浏览器 再浏览界面 Intent intent = IntentUtils.startUriLink(link); if (IntentUtils.checkResolveIntent(this, intent)) { startActivity(intent); } else { Logger.d("checkResolveIntent = null"); } } @Override public void onDialogPositiveClick(String describe, int selectPosition) { Logger.d("describe=" + describe + " selectPosition=" + selectPosition); actionGather(describe, selectPosition); } private void actionLike(MenuItem item) { Logger.d(); //根据当前值 取操作符 String operate = isLike ? Constant.OPERATEUNLIKE : Constant.OPERATELIKE; RetrofitClient.createService(OperateAPI.class) .httpsLikeOperate(mAuthorization, mPinsId, operate) .subscribeOn(Schedulers.io()) .delay(600, TimeUnit.MILLISECONDS)//延迟 使得能够完成动画 .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<LikePinsOperateBean>() { @Override public void onStart() { super.onStart(); Logger.d(); item.setEnabled(false);//不可点击 AnimatedVectorDrawableCompat drawable = (AnimatedVectorDrawableCompat) item.getIcon(); if (drawable != null) { drawable.start(); } } @Override public void onCompleted() { Logger.d(); item.setEnabled(true); } @Override public void onError(Throwable e) { Logger.d(e.toString()); item.setEnabled(true); checkException(e, mAppBar); } @Override public void onNext(LikePinsOperateBean likePinsOperateBean) { Logger.d(); //网络操作成功 标志位取反 然后重设图标 isLike = !isLike; setIconDynamic(item, isLike); } }); } private void actionGather(String describe, int selectPosition) { Animator animation = AnimatorUtils.getRotationAD(mFabOperate); MyRxObservable.add(animation) .observeOn(Schedulers.io()) .subscribeOn(AndroidSchedulers.mainThread()) .flatMap(new Func1<Void, Observable<GatherResultBean>>() { @Override public Observable<GatherResultBean> call(Void aVoid) { return RetrofitClient.createService(OperateAPI.class) .httpsGatherPins(mAuthorization, mBoardIdArray[selectPosition], describe, mPinsId); } }) .observeOn(AndroidSchedulers.mainThread())//最后统一回到UI线程中处理 .subscribe(new Subscriber<GatherResultBean>() { @Override public void onCompleted() { Logger.d(); setFabDrawableAnimator(R.drawable.ic_done_white_24dp, mFabOperate); } @Override public void onError(Throwable e) { Logger.d(e.toString()); checkException(e, mAppBar); setFabDrawableAnimator(R.drawable.ic_report_white_24dp, mFabOperate); } @Override public void onNext(GatherResultBean gatherResultBean) { Logger.d(); //成功后取反 isGathered = !isGathered; } }); } /** * 配置fab的drawable 和动画显示 * * @param resId * @param mFabActionBtn */ private void setFabDrawableAnimator(int resId, FloatingActionButton mFabActionBtn) { mFabActionBtn.hide(new FloatingActionButton.OnVisibilityChangedListener() { @Override public void onHidden(FloatingActionButton fab) { super.onHidden(fab); Logger.d("onHidden"); fab.setImageResource(resId); fab.show(); } }); } }