package com.dl7.mvp.module.news.article; import android.animation.Animator; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.support.v4.view.ViewCompat; import android.support.v4.widget.NestedScrollView; import android.text.TextUtils; import android.view.Gravity; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewStub; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.dl7.mvp.R; import com.dl7.mvp.api.NewsUtils; import com.dl7.mvp.api.bean.NewsDetailInfo; import com.dl7.mvp.injector.components.DaggerNewsArticleComponent; import com.dl7.mvp.injector.modules.NewsArticleModule; import com.dl7.mvp.module.base.BaseSwipeBackActivity; import com.dl7.mvp.module.base.IBasePresenter; import com.dl7.mvp.utils.AnimateHelper; import com.dl7.mvp.utils.DialogHelper; import com.dl7.mvp.utils.ListUtils; import com.dl7.mvp.utils.PreferencesUtils; import com.dl7.mvp.widget.EmptyLayout; import com.dl7.mvp.widget.PullScrollView; import com.flyco.animation.SlideEnter.SlideBottomEnter; import com.flyco.animation.SlideEnter.SlideLeftEnter; import com.flyco.animation.SlideExit.SlideRightExit; import com.flyco.animation.SlideExit.SlideTopExit; import com.zzhoujay.richtext.RichText; import com.zzhoujay.richtext.callback.OnURLClickListener; import java.util.List; import butterknife.BindView; import butterknife.OnClick; public class NewsArticleActivity extends BaseSwipeBackActivity<IBasePresenter> implements INewsArticleView { private static final String SHOW_POPUP_DETAIL = "ShowPopupDetail"; private static final String NEWS_ID_KEY = "NewsIdKey"; @BindView(R.id.iv_back) ImageView mIvBack; @BindView(R.id.tv_time) TextView mTvTime; @BindView(R.id.tv_title) TextView mTvTitle; @BindView(R.id.ll_pre_toolbar) LinearLayout mLlPreToolbar; @BindView(R.id.tv_content) TextView mTvContent; @BindView(R.id.tv_next_title) TextView mTvNextTitle; @BindView(R.id.ll_foot_view) LinearLayout mLlFootView; @BindView(R.id.scroll_view) PullScrollView mScrollView; @BindView(R.id.empty_layout) EmptyLayout mEmptyLayout; @BindView(R.id.iv_back_2) ImageView mIvBack2; @BindView(R.id.tv_title_2) TextView mTvTitle2; @BindView(R.id.ll_top_bar) LinearLayout mLlTopBar; private int mToolbarHeight; private int mTopBarHeight; private Animator mTopBarAnimator; private int mLastScrollY = 0; // 最小触摸滑动距离 private int mMinScrollSlop; private String mNewsId; private String mNextNewsId; public static void launch(Context context, String newsId) { Intent intent = new Intent(context, NewsArticleActivity.class); intent.putExtra(NEWS_ID_KEY, newsId); context.startActivity(intent); ((Activity) context).overridePendingTransition(R.anim.slide_right_entry, R.anim.hold); } private void launchInside(String newsId) { Intent intent = new Intent(this, NewsArticleActivity.class); intent.putExtra(NEWS_ID_KEY, newsId); finish(); startActivity(intent); overridePendingTransition(R.anim.slide_bottom_entry, R.anim.hold); } @Override protected int attachLayoutRes() { return R.layout.activity_news_article; } @Override protected void initInjector() { mNewsId = getIntent().getStringExtra(NEWS_ID_KEY); DaggerNewsArticleComponent.builder() .newsArticleModule(new NewsArticleModule(this, mNewsId)) .build() .inject(this); } @Override protected void initViews() { mToolbarHeight = getResources().getDimensionPixelSize(R.dimen.news_detail_toolbar_height); mTopBarHeight = getResources().getDimensionPixelSize(R.dimen.toolbar_height); mMinScrollSlop = ViewConfiguration.get(this).getScaledTouchSlop(); ViewCompat.setTranslationY(mLlTopBar, -mTopBarHeight); mScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { @Override public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { if (scrollY > mToolbarHeight) { if (AnimateHelper.isRunning(mTopBarAnimator)) { return; } if (Math.abs(scrollY - mLastScrollY) > mMinScrollSlop) { boolean isPullUp = scrollY > mLastScrollY; mLastScrollY = scrollY; if (isPullUp && mLlTopBar.getTranslationY() != -mTopBarHeight) { mTopBarAnimator = AnimateHelper.doMoveVertical(mLlTopBar, (int) mLlTopBar.getTranslationY(), -mTopBarHeight, 300); } else if (!isPullUp && mLlTopBar.getTranslationY() != 0) { mTopBarAnimator = AnimateHelper.doMoveVertical(mLlTopBar, (int) mLlTopBar.getTranslationY(), 0, 300); } } } else { if (mLlTopBar.getTranslationY() != -mTopBarHeight) { AnimateHelper.stopAnimator(mTopBarAnimator); ViewCompat.setTranslationY(mLlTopBar, -mTopBarHeight); mLastScrollY = 0; } } } }); mScrollView.setFootView(mLlFootView); mScrollView.setPullListener(new PullScrollView.OnPullListener() { boolean isShowPopup = PreferencesUtils.getBoolean(NewsArticleActivity.this, SHOW_POPUP_DETAIL, true); @Override public boolean isDoPull() { if (mEmptyLayout.getEmptyStatus() != EmptyLayout.STATUS_HIDE) { return false; } if (isShowPopup) { _showPopup(); isShowPopup = false; } return true; } @Override public boolean handlePull() { if (TextUtils.isEmpty(mNextNewsId)) { return false; } else { launchInside(mNextNewsId); return true; } } }); } @Override protected void updateViews(boolean isRefresh) { mPresenter.getData(isRefresh); } @Override public void loadData(NewsDetailInfo newsDetailBean) { mTvTitle.setText(newsDetailBean.getTitle()); mTvTitle2.setText(newsDetailBean.getTitle()); mTvTime.setText(newsDetailBean.getPtime()); RichText.from(newsDetailBean.getBody()) .into(mTvContent); _handleSpInfo(newsDetailBean.getSpinfo()); _handleRelatedNews(newsDetailBean); } /** * 处理关联的内容 * * @param spinfo */ private void _handleSpInfo(List<NewsDetailInfo.SpinfoEntity> spinfo) { if (!ListUtils.isEmpty(spinfo)) { ViewStub stub = (ViewStub) findViewById(R.id.vs_related_content); assert stub != null; stub.inflate(); TextView tvType = (TextView) findViewById(R.id.tv_type); TextView tvRelatedContent = (TextView) findViewById(R.id.tv_related_content); tvType.setText(spinfo.get(0).getSptype()); RichText.from(spinfo.get(0).getSpcontent()) // 这里处理超链接的点击 .urlClick(new OnURLClickListener() { @Override public boolean urlClicked(String url) { String newsId = NewsUtils.clipNewsIdFromUrl(url); if (newsId != null) { launch(NewsArticleActivity.this, newsId); } return true; } }) .into(tvRelatedContent); } } /** * 处理关联新闻 * * @param newsDetailBean */ private void _handleRelatedNews(NewsDetailInfo newsDetailBean) { if (ListUtils.isEmpty(newsDetailBean.getRelative_sys())) { mTvNextTitle.setText("没有相关文章了"); } else { mNextNewsId = newsDetailBean.getRelative_sys().get(0).getId(); mTvNextTitle.setText(newsDetailBean.getRelative_sys().get(0).getTitle()); } } /** * 显示弹出提示 */ private void _showPopup() { if (PreferencesUtils.getBoolean(this, SHOW_POPUP_DETAIL, true)) { DialogHelper.createPopup(this, R.layout.layout_popup) .anchorView(mTvTitle2) .gravity(Gravity.BOTTOM) .showAnim(new SlideBottomEnter()) .dismissAnim(new SlideTopExit()) .autoDismiss(true) .autoDismissDelay(3500) .show(); DialogHelper.createPopup(this, R.layout.layout_popup_bottom) .anchorView(mLlFootView) .gravity(Gravity.TOP) .showAnim(new SlideLeftEnter()) .dismissAnim(new SlideRightExit()) .autoDismiss(true) .autoDismissDelay(3500) .show(); PreferencesUtils.putBoolean(this, SHOW_POPUP_DETAIL, false); } } @OnClick({R.id.iv_back, R.id.iv_back_2, R.id.tv_title_2}) public void onClick(View view) { switch (view.getId()) { case R.id.iv_back: case R.id.iv_back_2: finish(); break; case R.id.tv_title_2: mScrollView.stopNestedScroll(); mScrollView.smoothScrollTo(0, 0); break; } } @Override public void finish() { super.finish(); overridePendingTransition(R.anim.hold, R.anim.slide_right_exit); } }