显示gif图的两种解决办法:http://blog.csdn.net/up1up2up3/article/details/22682549
在显示gif动态图时使用了两种方法:gifView和android-gif-drawable。
gifView:
由于gifView是不支持加载bitmap,所以使用universal image loader来加载图片,一开始的想法是加载完成之后从缓存文件中读取流来设置图片,虽然成功了,但是图片大小不能改变,显示出来很小,然后修改GifView类,当画图时设置大小为计算之后相对屏幕的大小,但是问题时显示出来之后反复出现OOM,这也是GifView的一个不好之处,大图出错。
之后就找到了另外一个解决办法:
android-gif-drawable:
http://my.oschina.net/u/1175746/blog/288258
http://my.oschina.net/u/1175746/blog/345159
使用方法跟普通控件一样,加载本地图片简单方便,对于网络图片可以使用android-async-http来加载,刚开始的想法还是使用universal image loader,想着在加载完成之后从缓存中取出品成drawable,然后设置background,但是失败了,之后才打算使用其他办法。
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
asyncHttpClient.get(largeUrl, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
// TODO Auto-generated method stub
holder.donut_progress.setVisibility(View.GONE);
GifDrawable drawable = null;
try {
drawable = new GifDrawable(arg2);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
android.view.ViewGroup.LayoutParams para;
para = holder.gif_view.getLayoutParams();
// 获取
Log.d(TAG, "layout width0: " + drawable.getIntrinsicWidth());
Log.d(TAG,
"layout height0: " + drawable.getIntrinsicHeight());
int width = getScreenWidth(mContext); // 屏幕宽度(像素)
// 设置
para.height = width * drawable.getIntrinsicHeight()
/ drawable.getIntrinsicWidth();
para.width = width;
holder.gif_view.setLayoutParams(para);
holder.gif_view.setBackgroundDrawable(drawable);
}
@Override
public void onProgress(int bytesWritten, int totalSize) {
// TODO Auto-generated method stub
holder.donut_progress.setProgress(Math.round(100.0f
* bytesWritten / totalSize));
}
@Override
public void onStart() {
holder.donut_progress.setProgress(0);
File file_t = imageLoader.getDiskCache().get(meddileUrl);
Drawable drawable_t;
try {
InputStream inputStream = new FileInputStream(file_t);
drawable_t = Bitmap2DrawAble2Byte2InputStream
.getInstance()
.InputStream2Drawable(inputStream);
inputStream.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
drawable_t = mContext.getResources().getDrawable(
R.drawable.ic_empty);
}
android.view.ViewGroup.LayoutParams para;
para = holder.gif_view.getLayoutParams();
// 获取
Log.d(TAG,
"layout width0: " + drawable_t.getIntrinsicWidth());
Log.d(TAG,
"layout height0: "
+ drawable_t.getIntrinsicHeight());
int width = getScreenWidth(mContext); // 屏幕宽度(像素)
// 设置
para.height = width * drawable_t.getIntrinsicHeight()
/ drawable_t.getIntrinsicWidth();
para.width = width;
holder.gif_view.setLayoutParams(para);
holder.gif_view.setBackgroundDrawable(drawable_t);
Log.i(TAG, "width=" + holder.gif_view.getWidth());
Log.i(TAG, "height=" + holder.gif_view.getHeight());
}
@Override
public void onFailure(int arg0, Header[] arg1, byte[] arg2,
Throwable arg3) {
// TODO Auto-generated method stub
Toast.makeText(mContext, "加载失败", Toast.LENGTH_SHORT).show();
holder.gif_view.setBackgroundResource(R.drawable.ic_error);
}
});
这是整个的过程,在开始的时候设置默认图片,是之前缓存的缩略图,然后再设置新图,在使用的时候imageview的大小搞了半天。最后的解决是动态设置大小,因为使用scapeType没用。