package com.aiyou.news; import java.util.ArrayList; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import com.aiyou.BaseActivity; import com.aiyou.R; import com.aiyou.news.utils.News; import com.aiyou.news.utils.News.NewsType; import com.aiyou.news.utils.NewsManager; import com.aiyou.utils.ActivityFunc; import com.aiyou.utils.AiYouManager; import com.aiyou.utils.SwitchManager; import com.aiyou.utils.share.ShareTask; import com.aiyou.view.GetScrollDistanceScrollView.OnScrollListener; import com.aiyou.view.ScrollTextView; import com.aiyou.viewLargeImage.ViewLargeImageActivity; import external.otherview.BounceScrollView; import external.otherview.Win8ProgressBar; import external.smartimageview.SmartImageView; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.text.ClipboardManager; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.Animation.AnimationListener; import android.webkit.WebView; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.Toast; import android.widget.ImageView.ScaleType; /** * 显示信息门户、北邮要闻、论坛RSS内容的Activity * * @author sollian */ @SuppressWarnings("deprecation") @SuppressLint("DefaultLocale") public class NewsContentActivity extends BaseActivity implements OnScrollListener { /** * 新闻类型标志位 */ private NewsType mMode; private News mNews; private ArrayList<String> mImgUrlList = new ArrayList<>(); private int mImgId = 0; /** * 控件 */ // popmenu private FrameLayout mMenuFLayout; // 标题 private LinearLayout mTitleLLayout; private ScrollTextView mTitleSTV; // 内容 private LinearLayout mContentLLayout; // 进度条 private FrameLayout mProgressFLayout; private Win8ProgressBar mProgressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (SwitchManager.getInstance(getBaseContext()).isNightModeEnabled()) { // 夜间模式 this.setTheme(R.style.ThemeNight); } else { // 日间模式 this.setTheme(R.style.ThemeDay); } setContentView(R.layout.activity_news_content); init(); Intent intent = getIntent(); mMode = (NewsType) intent .getSerializableExtra(NewsListActivity.KEY_MODE); mNews = (News) intent.getSerializableExtra(NewsListActivity.KEY_DATA); if (mNews == null) { selfFinish(null); } // 设置标题 mTitleSTV.setText(mNews.title); processContent(mNews.content); } public void onShare(View view) { // 分享 ShareTask task = new ShareTask(NewsContentActivity.this, mNews.title, mNews.url, new ShareTask.ShareListener() { @Override public void onShareStart() { showProgress(true); } @Override public void onShareFinish(Boolean success) { showProgress(false); } }); task.execute(); mMenuFLayout.setVisibility(View.GONE); } /** * 网址复制 * * @param view */ public void onCopy(View view) { // 将网址复制到剪贴板 ClipboardManager copy = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); copy.setText(mNews.url); Toast.makeText(getBaseContext(), "复制成功", Toast.LENGTH_SHORT).show(); mMenuFLayout.setVisibility(View.GONE); } public void onClick(View view) { if (view == mMenuFLayout) { mMenuFLayout.setVisibility(View.GONE); } } private void processContent(String data) { // 清空图片地址list mImgUrlList.clear(); // 分割出图片 String array1[] = data.split("<(img|IMG)"); String wvContent = array1[0]; String imgSrc = ""; int index; String strImg; Pattern p; Matcher m; MatchResult mr; String imgName; for (int i = 1; i < array1.length; i++) { index = array1[i].indexOf(">"); strImg = array1[i].substring(0, index + 1); p = Pattern.compile("src=\"(.*?)\""); m = p.matcher(strImg); while (m.find()) { mr = m.toMatchResult(); imgSrc = mr.group(1); } String array2[] = imgSrc.split("/"); imgName = array2[array2.length - 1]; if (imgName.contains(".gif") || imgName.contains(".GIF") || imgName.equalsIgnoreCase("icon_default.png")) { wvContent += "<img" + array1[i]; } else { // 显示WebView processWebView(wvContent); // 更新wvContent wvContent = array1[i].substring(index + 1); // 显示照片 processImage(imgSrc); } } // 显示WebView processWebView(wvContent); // 更新视图 mContentLLayout.invalidate(); } /** * 处理WebView显示内容的方法 * * @param wvContent 要处理得内容 */ private void processWebView(String wvContent) { String tableArr[]; // 分割出表格 if (wvContent.contains("<TABLE") || wvContent.contains("<table")) { tableArr = wvContent.split("</?(table|TABLE)>?"); } else { tableArr = new String[1]; tableArr[0] = wvContent; } Document doc; String outerHtml; String text; for (int j = 0; j < tableArr.length; j++) { wvContent = tableArr[j]; if (j % 2 == 1) { wvContent = "<table" + wvContent + "</table>"; } doc = Jsoup.parse(wvContent); outerHtml = doc.outerHtml(); text = doc.text(); text = AiYouManager.getTxtWithoutNTSRElement(text, "");// 去掉非显示字符 if (!"".equals(text)) { WebView wv = new WebView(NewsContentActivity.this); // 取消硬件加速,否则会闪屏——奇怪的是该设置导致文字显示不出来,不知为甚 // wv.setLayerType(WebView.LAYER_TYPE_SOFTWARE, paint); // 设置背景色 if (Build.VERSION.SDK_INT >= 16) { wv.setBackgroundColor(0x01000000); } else { if (SwitchManager.getInstance(getBaseContext()) .isNightModeEnabled()) { wv.setBackgroundColor(Color.parseColor("#111111")); } else { wv.setBackgroundColor(Color.parseColor("#ffffff")); } } // 滚动条不显示 wv.setHorizontalScrollBarEnabled(false); wv.setVerticalScrollBarEnabled(false); // 控制页面缩放比例 if (mMode == NewsType.headline) { // 北邮要闻 wv.setInitialScale(NewsManager.mHeadlineScaleSize); } else { // 信息门户 wv.setInitialScale(NewsManager.mNewsScaleSize); } outerHtml = "<body style=\"text-align:justify;text-justify:distribute-all-lines;\">" + outerHtml + "</body>"; int fontSize = AiYouManager.getInstance(getBaseContext()) .sp2px(8); if (SwitchManager.getInstance(getBaseContext()) .isNightModeEnabled()) { outerHtml = "<style type=\"text/css\">body{ font-size: " + fontSize + "px; color:#888888}a:link{color:#00aaaa}</style>" + outerHtml; } else { outerHtml = "<style type=\"text/css\">body{ font-size: " + fontSize + "px; color:#000000}</style>" + outerHtml; } wv.loadDataWithBaseURL(null, outerHtml, "text/html", "utf-8", null); mContentLLayout.addView(wv); } } } /** * 显示图片的方法 * * @param imgSrc 图片路径 */ private void processImage(String imgSrc) { SmartImageView siv = new SmartImageView(NewsContentActivity.this); siv.setScaleType(ScaleType.CENTER_INSIDE); LayoutParams param = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); siv.setLayoutParams(param); siv.setMaxWidth(AiYouManager.getInstance(getBaseContext()).dip2px(200)); siv.setMaxHeight(AiYouManager.getInstance(getBaseContext()).dip2px(300)); String url = NewsManager.imgPathEncoder(imgSrc); siv.setImageUrl(url, R.drawable.iu_default_gray, R.drawable.iu_default_green); siv.setBackgroundColor(Color.WHITE); siv.setAdjustViewBounds(true); siv.setTag(mImgId++ + ""); // 将图片地址添加到listImgSrc中 mImgUrlList.add(url); // 单击图片查看大图 siv.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(NewsContentActivity.this, ViewLargeImageActivity.class); intent.putExtra(ViewLargeImageActivity.KEY_CUR_SEL, (String) view.getTag()); intent.putExtra(ViewLargeImageActivity.KEY_URL_LIST, mImgUrlList); intent.putExtra(ViewLargeImageActivity.KEY_NEWS, true); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); ActivityFunc.startActivity(NewsContentActivity.this, intent); } }); mContentLLayout.addView(siv); } /** * 设置cpb_progress的状态和是否显示 * * @param flag */ private void showProgress(boolean flag) { if (flag) { mProgressFLayout.setVisibility(View.VISIBLE); mProgressBar.start(); } else { mProgressFLayout.setVisibility(View.GONE); mProgressBar.stop(); } } public void selfFinish(View view) { scrollToFinishActivity(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // 按下键盘上返回按钮 if (keyCode == KeyEvent.KEYCODE_BACK) { selfFinish(null); return true; } else if (keyCode == KeyEvent.KEYCODE_MENU) { showPopMenu(null); return true; } return super.onKeyDown(keyCode, event); } @Override protected void onDestroy() { super.onDestroy(); mImgUrlList.clear(); mImgUrlList = null; mNews = null; System.gc(); } @Override public void onScroll(int y, int oldY) { if (y < AiYouManager.getInstance(getBaseContext()).dip2px(70)) { mTitleLLayout.clearAnimation(); mTitleLLayout.setTag(null); if (View.VISIBLE != mTitleLLayout.getVisibility()) { showTitle(true); } } else { if (mTitleLLayout.getTag() == null) { if (y > oldY && View.VISIBLE == mTitleLLayout.getVisibility()) { showTitle(false); } else if (y < oldY && View.VISIBLE != mTitleLLayout.getVisibility()) { showTitle(true); } } } } /** * 是否显示标题栏 * * @param flag */ private void showTitle(final boolean flag) { Animation anim; mTitleLLayout.setTag("anim"); if (flag) { anim = AnimationUtils.loadAnimation(this, R.anim.slide_in_from_top); anim.setDuration(1000); mTitleLLayout.setVisibility(View.VISIBLE); mTitleLLayout.startAnimation(anim); } else { anim = AnimationUtils.loadAnimation(this, R.anim.slide_out_to_top); anim.setDuration(1000); mTitleLLayout.startAnimation(anim); } anim.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation arg0) { if (!flag) { mTitleLLayout.setVisibility(View.GONE); } mTitleLLayout.setTag(null); } @Override public void onAnimationRepeat(Animation arg0) { } @Override public void onAnimationStart(Animation arg0) { } }); } public void showPopMenu(View view) { if (View.VISIBLE == mMenuFLayout.getVisibility()) { mMenuFLayout.setVisibility(View.GONE); } else { mMenuFLayout.setVisibility(View.VISIBLE); } } private void init() { mTitleLLayout = (LinearLayout) findViewById(R.id.content_ll_custom_head); mTitleSTV = (ScrollTextView) findViewById(R.id.activity_newscontent_stv_title); BounceScrollView mBounceSV = (BounceScrollView) findViewById(R.id.activity_newscontent_sv); mBounceSV.setOnScrollListener(this); mContentLLayout = (LinearLayout) findViewById(R.id.activity_newscontent_ll_content); /** * popmenu */ mMenuFLayout = (FrameLayout) findViewById(R.id.activity_newscontent_fl_menu); /** * 进度条 */ mProgressFLayout = (FrameLayout) findViewById(R.id.fl_progress); mProgressBar = (Win8ProgressBar) findViewById(R.id.progress_bar); } }