package tv.baokan.baokanandroid.ui.activity; import android.animation.AnimatorInflater; import android.animation.AnimatorSet; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Handler; import android.support.v4.view.ViewPager; import android.support.v4.widget.NestedScrollView; import android.support.v7.app.AlertDialog; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.view.ViewTreeObserver; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.facebook.rebound.SimpleSpringListener; import com.facebook.rebound.Spring; import com.facebook.rebound.SpringSystem; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Timer; import java.util.TimerTask; import cn.sharesdk.onekeyshare.OnekeyShare; import okhttp3.Call; import tv.baokan.baokanandroid.R; import tv.baokan.baokanandroid.adapter.PhotoDetailViewPageAdapter; import tv.baokan.baokanandroid.cache.NewsDALManager; import tv.baokan.baokanandroid.model.ArticleDetailBean; import tv.baokan.baokanandroid.model.UserBean; import tv.baokan.baokanandroid.utils.APIs; import tv.baokan.baokanandroid.utils.LogUtils; import tv.baokan.baokanandroid.utils.NetworkUtils; import tv.baokan.baokanandroid.utils.ProgressHUD; import tv.baokan.baokanandroid.utils.SizeUtils; public class PhotoDetailActivity extends BaseActivity implements View.OnClickListener { private int mPosition = 0; private static final String TAG = "PhotoDetailActivity"; private String classid; // 栏目id private String id; // 文章id private ArticleDetailBean detailBean; // 图库详情模型 private List<ArticleDetailBean.ArticleDetailPhotoBean> photoBeans; // 图库所有图片模型集合 private PhotoDetailViewPageAdapter adapter; private ViewPager mViewPager; // 图片载体 private View mTopLayout; // 顶部视图 private TextView mPageTextView; // 页码 private TextView mReportTextView; // 举报 private ProgressBar mProgressBar; // 进度圈 private View mBottomLayout; // 底部视图 private NestedScrollView mCaptionScriollView; // 图片文字介绍父视图 private TextView mCaptionTextView; // 图片文字介绍 private ImageButton mBackButton; // 底部条 返回 private ImageButton mEditButton; // 底部条 编辑发布评论信息 private ImageButton mCommentButton; // 底部条 评论列表 private ImageButton mCollectionButton; // 底部条 收藏 private ImageButton mShareButton; // 底部条 分享 private TextView mPlnumTextView; // 评论数量 private AlertDialog commentDialog; // 评论会话框 private EditText commentEditText; // 评论文本框 /** * 便捷启动当前activity * * @param activity 来源activity * @param classid 栏目id * @param id 文章id */ public static void start(Activity activity, String classid, String id) { Intent intent = new Intent(activity, PhotoDetailActivity.class); intent.putExtra("classid_key", classid); intent.putExtra("id_key", id); activity.startActivity(intent); activity.overridePendingTransition(R.anim.push_enter, R.anim.push_exit); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_photo_detail); prepareUI(); prepareData(); } /** * 准备UI */ private void prepareUI() { mViewPager = (ViewPager) findViewById(R.id.vp_photo_detail_viewPager); mTopLayout = findViewById(R.id.ll_photo_detail_top_layout); mPageTextView = (TextView) findViewById(R.id.tv_photo_detail_page); mReportTextView = (TextView) findViewById(R.id.tv_photo_detail_report); mProgressBar = (ProgressBar) findViewById(R.id.pb_photo_detail_progressbar); mBottomLayout = findViewById(R.id.ll_photo_detail_bottom_layout); mCaptionScriollView = (NestedScrollView) findViewById(R.id.nsv_photo_detail_caption_scrollview); mCaptionTextView = (TextView) findViewById(R.id.tv_photo_detail_caption); mBackButton = (ImageButton) findViewById(R.id.ib_photo_detail_bottom_bar_back); mEditButton = (ImageButton) findViewById(R.id.ib_photo_detail_bottom_bar_edit); mCommentButton = (ImageButton) findViewById(R.id.ib_photo_detail_bottom_bar_comment); mCollectionButton = (ImageButton) findViewById(R.id.ib_photo_detail_bottom_bar_collection); mShareButton = (ImageButton) findViewById(R.id.ib_photo_detail_bottom_bar_share); mPlnumTextView = (TextView) findViewById(R.id.tv_photo_detail_plnum); // 监听点击事件 mReportTextView.setOnClickListener(this); mBackButton.setOnClickListener(this); mEditButton.setOnClickListener(this); mCommentButton.setOnClickListener(this); mCollectionButton.setOnClickListener(this); mShareButton.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.ib_photo_detail_bottom_bar_back: finish(); break; case R.id.ib_photo_detail_bottom_bar_edit: showCommentDialog(); break; case R.id.ib_photo_detail_bottom_bar_comment: CommentListActivity.start(mContext, classid, id, null, "photo"); break; case R.id.ib_photo_detail_bottom_bar_collection: collectArticle(); break; case R.id.ib_photo_detail_bottom_bar_share: share(); break; case R.id.tv_photo_detail_report: ProgressHUD.showInfo(mContext, "举报成功"); break; } } /** * 分享 */ private void share() { OnekeyShare oks = new OnekeyShare(); // 关闭sso授权 oks.disableSSOWhenAuthorize(); // title标题,印象笔记、邮箱、信息、微信、人人网、QQ和QQ空间使用 oks.setTitle(detailBean.getTitle()); // titleUrl是标题的网络链接,仅在Linked-in,QQ和QQ空间使用 oks.setTitleUrl(detailBean.getTitleurl()); // text是分享文本,所有平台都需要这个字段 oks.setText(photoBeans.get(mPosition).getCaption()); //分享网络图片,新浪微博分享网络图片需要通过审核后申请高级写入接口,否则请注释掉测试新浪微博 oks.setImageUrl(photoBeans.get(mPosition).getBigpic()); // url仅在微信(包括好友和朋友圈)中使用 oks.setUrl(detailBean.getTitleurl()); // site是分享此内容的网站名称,仅在QQ空间使用 oks.setSite("爆侃网文"); // siteUrl是分享此内容的网站地址,仅在QQ空间使用 oks.setSiteUrl(detailBean.getTitleurl()); // 启动分享GUI oks.show(mContext); } /** * 准备数据 */ private void prepareData() { // 取出启动activity时传递的数据 Intent intent = getIntent(); classid = intent.getStringExtra("classid_key"); id = intent.getStringExtra("id_key"); // 加载网络数据 loadPhotoDetailFromNetwork(); } /** * 加载图片详情数据从网络 */ private void loadPhotoDetailFromNetwork() { NewsDALManager.shared.loadNewsContent(classid, id, new NewsDALManager.NewsContentCallback() { @Override public void onSuccess(JSONObject jsonObject) { detailBean = new ArticleDetailBean(jsonObject); // 配置UI setupUI(detailBean); } @Override public void onError(String tipString) { ProgressHUD.showInfo(mContext, tipString); } }); } /** * 详情数据加载成功后 - 配置UI * * @param detailBean 详情模型 */ private void setupUI(ArticleDetailBean detailBean) { photoBeans = detailBean.getMorePicsList(); // 隐藏进度条 mProgressBar.setVisibility(View.INVISIBLE); // 评论数量 mPlnumTextView.setText(detailBean.getPlnum()); // 收藏状态 1已经收藏过 if (detailBean.getHavefava().equals("1")) { mCollectionButton.setImageResource(R.drawable.bottom_bar_collection_selected); } else { mCollectionButton.setImageResource(R.drawable.bottom_bar_collection_normal1); } // 组合图片url集合 List<String> photoList = new ArrayList<>(); for (ArticleDetailBean.ArticleDetailPhotoBean photoBean : photoBeans) { photoList.add(photoBean.getBigpic()); } //设置ViewPager adapter = new PhotoDetailViewPageAdapter(this, photoList); adapter.setOnPhotoTapListener(new PhotoDetailViewPageAdapter.OnPhotoTapListener() { @Override public void onPhotoTap() { // 隐藏/显示 顶部/底部视图 onPhotoOneTapped(); } }); mViewPager.setAdapter(adapter); // 默认从第一页开始浏览 mViewPager.setCurrentItem(mPosition); onPageChanged(mPosition); // 监听viewPager的滚动 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mPosition = position; onPageChanged(position); } @Override public void onPageScrollStateChanged(int state) { } }); } /** * 页码发生改变 更新页码指示器和图片描述文字 * * @param position 页码 */ private void onPageChanged(int position) { mPageTextView.setText(position + 1 + "/" + photoBeans.size()); mCaptionTextView.setText(photoBeans.get(position).getCaption()); // 滚动到最顶部 mCaptionScriollView.scrollTo(0, 0); // 修改文本描述载体scrollView高度 ViewTreeObserver vto = mCaptionTextView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mCaptionTextView.getViewTreeObserver().removeOnGlobalLayoutListener(this); int height = mCaptionTextView.getHeight(); int scrollViewHeight = height + SizeUtils.dip2px(mContext, 45); int scrollViewMaxHeight = SizeUtils.dip2px(mContext, 120); // 修改文字载体ScrollView的高度 = mCaptionTextView高度 + 35dp,并且现在最大高度为200dip LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) mCaptionScriollView.getLayoutParams(); layoutParams.height = scrollViewHeight < scrollViewMaxHeight ? scrollViewHeight : scrollViewMaxHeight; mCaptionScriollView.setLayoutParams(layoutParams); } }); } // 是否是展开状态 - 默认是展开 boolean flag = true; /** * 图片单击手势 隐藏/展开 顶部、底部视图 */ private void onPhotoOneTapped() { if (flag) { flag = false; // 隐藏状态栏 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); // 为了调节隐藏UI的动画和隐藏状态栏动画一致 new Handler().postDelayed(new Runnable() { @Override public void run() { // 隐藏顶部底部视图 setupAnimation(mBottomLayout, R.animator.bottom_hide); setupAnimation(mTopLayout, R.animator.top_hide); } }, 200); } else { flag = true; // 展开顶部底部视图 setupAnimation(mBottomLayout, R.animator.bottom_show); setupAnimation(mTopLayout, R.animator.top_show); new Handler().postDelayed(new Runnable() { @Override public void run() { // 显示状态栏 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); } }, 330); } } /** * 给view添加指定属性动画 * * @param target 需要添加动画的对象 * @param id 动画id */ private void setupAnimation(View target, int id) { AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this, id); set.setTarget(target); set.start(); } /** * 弹出评论的会话框 */ private void showCommentDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); View view = View.inflate(this, R.layout.dialog_comment, null); builder.setView(view); builder.setCancelable(true); commentDialog = builder.create(); commentDialog.show(); commentEditText = (EditText) view.findViewById(R.id.et_comment_edittext); Button cancelButton = (Button) view.findViewById(R.id.btn_set_font_cancel); Button sendButton = (Button) view.findViewById(R.id.btn_set_font_send); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { commentDialog.dismiss(); } }); sendButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String comment = commentEditText.getText().toString(); if (!TextUtils.isEmpty(comment)) { sendComment(comment); commentDialog.dismiss(); } else { ProgressHUD.showInfo(mContext, "请输入评论内容"); } } }); // 自动弹出键盘 Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { InputMethodManager inputManager = (InputMethodManager) commentEditText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.showSoftInput(commentEditText, 0); } }, 250); } /** * 发布评论 * * @param comment 评论信息 */ private void sendComment(String comment) { LogUtils.d(TAG, "评论内容 = " + comment); HashMap<String, String> parameters = new HashMap<>(); parameters.put("classid", classid); parameters.put("id", id); parameters.put("saytext", comment); if (UserBean.isLogin()) { parameters.put("nomember", "0"); parameters.put("username", UserBean.shared().getUsername()); parameters.put("userid", UserBean.shared().getUserid()); parameters.put("token", UserBean.shared().getToken()); } else { parameters.put("nomember", "1"); } NetworkUtils.shared.post(APIs.SUBMIT_COMMENT, parameters, new NetworkUtils.StringCallback() { @Override public void onError(Call call, Exception e, int id) { ProgressHUD.showInfo(mContext, "您的网络不给力哦"); } @Override public void onResponse(String response, int id) { LogUtils.d(TAG, response); try { JSONObject jsonObject = new JSONObject(response); if (jsonObject.getString("err_msg").equals("success")) { ProgressHUD.showInfo(mContext, "评论成功"); } else { ProgressHUD.showInfo(mContext, jsonObject.getString("info")); } } catch (JSONException e) { e.printStackTrace(); ProgressHUD.showInfo(mContext, "数据解析异常"); } } }); } /** * 收藏文章 */ private void collectArticle() { if (UserBean.isLogin()) { HashMap<String, String> parameters = new HashMap<>(); parameters.put("username", UserBean.shared().getUsername()); parameters.put("userid", UserBean.shared().getUserid()); parameters.put("token", UserBean.shared().getToken()); parameters.put("classid", classid); parameters.put("id", id); NetworkUtils.shared.post(APIs.ADD_DEL_FAVA, parameters, new NetworkUtils.StringCallback() { @Override public void onError(Call call, Exception e, int id) { ProgressHUD.showInfo(mContext, "您的网络不给力哦"); } @Override public void onResponse(String response, int id) { LogUtils.d(TAG, response); try { JSONObject jsonObject = new JSONObject(response); String tipString = jsonObject.getString("info"); if (jsonObject.getString("err_msg").equals("success")) { if (jsonObject.getJSONObject("result").getInt("status") == 1) { // 收藏成功 tipString = "收藏成功"; mCollectionButton.setImageResource(R.drawable.bottom_bar_collection_selected); } else { // 取消收藏成功 tipString = "取消收藏"; mCollectionButton.setImageResource(R.drawable.bottom_bar_collection_normal1); } } if (tipString.equals("您还没登录!")) { showLoginTipDialog(); // 注销本地用户信息 UserBean.shared().logout(); } else { ProgressHUD.showInfo(mContext, tipString); } collectionButtonSpringAnimation(); } catch (JSONException e) { e.printStackTrace(); ProgressHUD.showInfo(mContext, "数据解析异常"); } } }); } else { showLoginTipDialog(); } } /** * 显示登录提示会话框 */ private void showLoginTipDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setCancelable(true); builder.setIcon(R.mipmap.ic_launcher); builder.setTitle("您还未登录"); builder.setMessage("登录以后才能收藏文章哦!"); builder.setPositiveButton("登录", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { LoginActivity.start(PhotoDetailActivity.this); } }); builder.setNegativeButton("以后再说", null); builder.show(); } /** * 收藏按钮弹簧动画 */ private void collectionButtonSpringAnimation() { SpringSystem springSystem = SpringSystem.create(); Spring spring = springSystem.createSpring(); spring.addListener(new SimpleSpringListener() { @Override public void onSpringUpdate(Spring spring) { float value = (float) spring.getCurrentValue(); float scale = value * 2f; mCollectionButton.setScaleX(scale); mCollectionButton.setScaleY(scale); } }); spring.setEndValue(0.5); } }