显示GIF动态图

显示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没用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用GDI+库显示gif动态图片,该类接口如下: 可以看出,该ImageEx完全继承了基类的接口函数。 说明: 如果打开非多帧图片,该类几乎完全等价于基类,比如你可以把该类的对象代入Graphics类系列的成员函数中; 如果打开的是多帧的图片,你只要打开图片后不调用InitAnimation函数(它会创建线程),则上述做法依然可以; 但如果调用InitAnimation函数后(单帧图像没关系,因为不会创建线程),则不可以了, 所有的基类继承过来的接口成员函数和配合gdi+库其他类的函数调用都是不可以的,因为没有作线程同步, 你只能调用下面位数不多的几个public成员函数,调用Destroy成员函数后,则就可以了,因为它会关闭线程。 其实你会发现下面的public成员函数操作的成员变量都是新增的成员变量,没涉及到线程同步问题。 class ImageEx : public Image { public: //以长度为nSize的内存pBuff中的内容构造图像 ImageEx(const void* pBuff, size_t nSize, BOOL useEmbeddedColorManagement = FALSE); //以类型为sResourceType,名称为sResource的资源构造图像 ImageEx(LPCTSTR sResourceType, LPCTSTR sResource, BOOL useEmbeddedColorManagement = FALSE); //以文件构造图像 ImageEx(LPCTSTR filename, BOOL useEmbeddedColorManagement = FALSE); //调用Destroy成员函数 ~ImageEx(); public: //如果已经构造的对象是动画,则创建动画线程,并返回true, //如果为静态图像或已经创建过动画线程,则也返回false // 图像将绘制在m_hWnd客户区的rect区域,会拉伸,支持镜像 bool InitAnimation(HWND hWnd, RECT rect); //判断是否为动画 bool IsAnimatedGIF() { return m_nFrameCount > 1; } //设置动画暂停与否 void SetPause(bool bPause); //判断动画是否处于暂停状态 bool IsPaused() { return m_bPause; } //关闭动画,事实上基类Image中还有的两个成员变量没有关闭,因为析构函数会调用基类析构函数进行关闭的 void Destroy(); //另外的非public的东西省略.. }; 用法: MFC对话框程序在下面添加: BOOL CTestDlgDlg::OnInitDialog() { CDialog::OnInitDialog(); //其它的初始化代码 // GDI+ //m_image为ImageEx指针类型成员变量,"GIF"为资源类型,"HEARTS"为资源名称 m_image = new ImageEx( _T("GIF"), _T("HEARTS") ); RECT rc; GetClientRect(&rc); m_image->InitAnimation(this->m_hWnd, rc);//创建gif播放线程 return TRUE; // return TRUE unless you set the focus to a control } CTestDlgDlg::~CTestDlgDlg() { // GDI+ delete m_image; } 其中的m_image = new ImageEx( _T("GIF"), _T("HEARTS") );你可以换成ImageEx类的另外两个构造函数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值