1. 程式人生 > >android textView 載入HTML 非同步載入網路圖片

android textView 載入HTML 非同步載入網路圖片

	/**
	 * 重寫圖片載入介面
	 * 
	 * @author Ruffian
	 * @date 2016年1月15日
	 * 
	 */
	class HtmlImageGetter implements Html.ImageGetter {

		/**
		 * 獲取圖片
		 */
		@Override
		public Drawable getDrawable(String source) {
			LevelListDrawable d = new LevelListDrawable();
			Drawable empty = getResources().getDrawable(
					R.drawable.image_horizontal);
			d.addLevel(0, 0, empty);
			d.setBounds(0, 0, PhoneUtils.getScreenWidth(mContext),
					empty.getIntrinsicHeight());
			new LoadImage().execute(source, d);
			return d;
		}

		/**
		 * 非同步下載圖片類
		 * 
		 * @author Ruffian
		 * @date 2016年1月15日
		 * 
		 */
		class LoadImage extends AsyncTask<Object, Void, Bitmap> {

			private LevelListDrawable mDrawable;

			@Override
			protected Bitmap doInBackground(Object... params) {
				String source = (String) params[0];
				mDrawable = (LevelListDrawable) params[1];
				try {
					InputStream is = new URL(source).openStream();
					return BitmapFactory.decodeStream(is);
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (MalformedURLException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
				return null;
			}

			/**
			 * 圖片下載完成後執行
			 */
			@Override
			protected void onPostExecute(Bitmap bitmap) {
				if (bitmap != null) {
					BitmapDrawable d = new BitmapDrawable(bitmap);
					mDrawable.addLevel(1, 1, d);
					/**
					 * 適配圖片大小 <br/>
					 * 預設大小:bitmap.getWidth(), bitmap.getHeight()<br/>
					 * 適配螢幕:getDrawableAdapter
					 */
					mDrawable = getDrawableAdapter(mContext, mDrawable,
							bitmap.getWidth(), bitmap.getHeight());

					// mDrawable.setBounds(0, 0, bitmap.getWidth(),
					// bitmap.getHeight());

					mDrawable.setLevel(1);

					/**
					 * 圖片下載完成之後重新賦值textView<br/>
					 * mtvActNewsContent:我專案中使用的textView
					 * 
					 */
					mtvActNewsContent.invalidate();
					CharSequence t = mtvActNewsContent.getText();
					mtvActNewsContent.setText(t);

				}
			}

			/**
			 * 載入網路圖片,適配大小
			 * 
			 * @param context
			 * @param drawable
			 * @param oldWidth
			 * @param oldHeight
			 * @return
			 * @author Ruffian
			 * @date 2016年1月15日
			 */
			public LevelListDrawable getDrawableAdapter(Context context,
					LevelListDrawable drawable, int oldWidth, int oldHeight) {
				LevelListDrawable newDrawable = drawable;
				long newHeight = 0;// 未知數
				int newWidth = PhoneUtils.getScreenWidth(context);// 預設螢幕寬
				newHeight = (newWidth * oldHeight) / oldWidth;
				// LogUtils.w("oldWidth:" + oldWidth + "oldHeight:" +
				// oldHeight);
				// LogUtils.w("newHeight:" + newHeight + "newWidth:" +
				// newWidth);
				newDrawable.setBounds(0, 0, newWidth, (int) newHeight);
				return newDrawable;
			}
		}

	}
呼叫處程式碼