Html类ImageGetter接口

在之前Html类支持的HTML标签文章中了解到当解析到标签时就会回调getDrawable()方法,并需要返回一个Drawable对象;当前我们需要定义类并实现ImageGetter接口以及在getDrawable方法中做相应的处理,下面我们则来看看具体该如何处理;

具体代码:

/**
 * ImageGetter接口的使用
 * @author Susie
 */
public class ImgLabelActivity extends Activity {

	private static final String TAG = "ImgLabelActivity";
	/**本地图片*/
	private TextView mTvOne;
	/**项目资源图片*/
	private TextView mTvTwo;
	/**网络图片*/
	private TextView mTvThree;
	/**网络图片name*/
	private String picName = "networkPic.jpg";
	/**网络图片Getter*/
	private NetworkImageGetter mImageGetter;
	/**网络图片路径*/
	private String htmlThree = "网络图片测试:" + "";
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_img_label);
        
        mTvOne = (TextView) this.findViewById(R.id.tv_img_label_one);
        String htmlOne = "本地图片测试:" + "";
        mTvOne.setText(Html.fromHtml(htmlOne, new LocalImageGetter(), null));

        mTvTwo = (TextView) this.findViewById(R.id.tv_img_label_two);
        String htmlTwo = "项目图片测试:" + "";
        mTvTwo.setText(Html.fromHtml(htmlTwo, new ProImageGetter(), null));
     
        
        mTvThree = (TextView) this.findViewById(R.id.tv_img_label_three);
        mImageGetter = new NetworkImageGetter();
        mTvThree.setText(Html.fromHtml(htmlThree, mImageGetter, null));
    }
    /**
     * 本地图片
     * @author Susie
     */
    private final class LocalImageGetter implements Html.ImageGetter{
    	
		@Override
		public Drawable getDrawable(String source) {
			// 获取本地图片
			Drawable drawable = Drawable.createFromPath(source);
			// 必须设为图片的边际,不然TextView显示不出图片
			drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
			// 将其返回
			return drawable;
		}
    }
    /**
     * 项目资源图片
     * @author Susie
     */
    private final class ProImageGetter implements Html.ImageGetter{

		@Override
		public Drawable getDrawable(String source) {
			// 获取到资源id
			int id = Integer.parseInt(source);
			Drawable drawable = getResources().getDrawable(id);
			drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
			return drawable;
		}
    }
    /**
     * 网络图片
     * @author Susie
     */
    private final class NetworkImageGetter implements Html.ImageGetter{

		@Override
		public Drawable getDrawable(String source) {
			
			Drawable drawable = null;
			// 封装路径
			File file = new File(Environment.getExternalStorageDirectory(), picName);
			// 判断是否以http开头
			if(source.startsWith("http")) {
				// 判断路径是否存在
				if(file.exists()) {
					// 存在即获取drawable
					drawable = Drawable.createFromPath(file.getAbsolutePath());
					drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
				} else {
					// 不存在即开启异步任务加载网络图片
					AsyncLoadNetworkPic networkPic = new AsyncLoadNetworkPic();
					networkPic.execute(source);
				}
			}
			return drawable;
		}
    }
    /**
     * 加载网络图片异步类
     * @author Susie
     */
    private final class AsyncLoadNetworkPic extends AsyncTask{

		@Override
		protected Void doInBackground(String... params) {
			// 加载网络图片
			loadNetPic(params);
			return null;
		}
		
		@Override
		protected void onPostExecute(Void result) {
			super.onPostExecute(result);
			// 当执行完成后再次为其设置一次
			mTvThree.setText(Html.fromHtml(htmlThree, mImageGetter, null));
		}
		/**加载网络图片*/
		private void loadNetPic(String... params) {
			String path = params[0];
			
			File file = new File(Environment.getExternalStorageDirectory(), picName);
			
			InputStream in = null;
			
			FileOutputStream out = null;
			
			try {
				URL url = new URL(path);
				
				HttpURLConnection connUrl = (HttpURLConnection) url.openConnection();
				
				connUrl.setConnectTimeout(5000);
				
				connUrl.setRequestMethod("GET");
 				
				if(connUrl.getResponseCode() == 200) {
					
					in = connUrl.getInputStream();
					
					out = new FileOutputStream(file);
					
					byte[] buffer = new byte[1024];
					
					int len;
					
					while((len = in.read(buffer))!= -1){
						out.write(buffer, 0, len);
					}
				} else {
					Log.i(TAG, connUrl.getResponseCode() + "");
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				
				if(in != null) {
					try {
						in.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
				if(out != null) {
					try {
						out.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
    }
}


 

需要注意的是:

在获取到drawable时需要为其设置边界,如没有设置的话TextView就不能显示该drawable了;

在加载网络图片时需要开启子线程去访问网络并将图片存储到本地,之后再次为其设置一次;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Android_Html)