Android显示GIF动画的几种方法

参考:

http://www.eoeandroid.com/thread-184872-1-1.html

http://blog.csdn.net/louiswangbing/article/details/6606933

http://stackoverflow.com/questions/15733749/read-gif-images-using-webview-android

http://stackoverflow.com/questions/3660209/display-animated-gif

http://stackoverflow.com/questions/4825383/gif-image-display-using-webview

临时参考,回头再整理 ;


1.通过开源项目GifView

主页:http://code.google.com/p/gifview/
下载:http://code.google.com/p/gifview/downloads/list
简介:android中现在没有直接显示gif的view,只能通过mediaplay来显示,且还常常不能正常显示出来,为此写了这个gifview,其用法和imageview一样,支持gif图片


使用方法:
1-把GifView.jar加入你的项目。
2-在xml中配置GifView的基本属性,GifView继承自View类,和Button、ImageView一样是一个UI控件。如:
<com.ant.liao.GifView android:id="@+id/gif2"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:paddingTop="4px" android:paddingLeft="14px" android:enabled="false" />
3-在代码中配置常用属性:
// 从xml中得到GifView的句柄
gf1 = (GifView) findViewById(R.id.gif1);
// 设置Gif图片源
gf1.setGifImage(R.drawable.gif1);
// 添加监听器
gf1.setOnClickListener(this);
// 设置显示的大小,拉伸或者压缩
gf1.setShowDimension(300, 300);
// 设置加载方式:先加载后显示、边加载边显示、只显示第一帧再显示
gf1.setGifImageType(GifImageType.COVER);
GifView的Jar包共有四个类
GifAction.java 观察者类,监视GIF是否加载成功
GifFrame.java 里面三个成员:当前图片、延时、下张Frame的链接。
GifDecoder.java 解码线程类
GifView.java 主类,包括常用方法,如GifView构造方法、设置图片源、延迟、绘制等。


另外,发一个做过优化的链接:
http://phenom.iteye.com/blog/1308835

2.通过动画
请参考:http://www.cnblogs.com/TerryBlog/archive/2010/09/06/1819641.html

/************************************************************************/
3.
Android动画背景图自动播放的实现
我们在开发android应用的时候,经常会遇到类似从网络加载大图,在加载的过程中,在图片要显示的ImageView位置,先显示一个转圈的loading动画图,给用户的体验会更好一些,要实现这个动画图很简单,使用在/res/anim中定义xml的方式,通常使用…. 来实现。 例如:
<?xml version="1.0" encoding="utf-8"?>
<animation-list android:oneshot="false"  
xmlns:android="http://schemas.android.com/apk/res/android">  
  <item android:duration="100" android:drawable="@drawable/loading_1" />  
  <item android:duration="100" android:drawable="@drawable/loading_2" />  
  <item android:duration="100" android:drawable="@drawable/loading_3" />  
  <item android:duration="100" android:drawable="@drawable/loading_4" />  
  <item android:duration="100" android:drawable="@drawable/loading_5" />  
  <item android:duration="100" android:drawable="@drawable/loading_6" />  
  <item android:duration="100" android:drawable="@drawable/loading_7" />  
  <item android:duration="100" android:drawable="@drawable/loading_8" />  
  <item android:duration="100" android:drawable="@drawable/loading_9" />  
  <item android:duration="100" android:drawable="@drawable/loading_10" />  
  <item android:duration="100" android:drawable="@drawable/loading_11" />  
  <item android:duration="100" android:drawable="@drawable/loading_12" />  
</animation-list>   

不过大多数朋友都会遇到的问题是,动画是做好了,但是界面在加载的时候,动画并不会自动播放,还得通过屏幕点击等事件来触发,这就失去了意义了,实际上,android的动画AnimationDrawable 组件里面有个start()方法用于启动动画播放,但是这个方法不能直接写在onClick,onStart,onResume里面,写进去也是无效的,无法启动动画,只能写在比如事件监听当中,于是我们可以使用点小技巧来实现自动播放
目前我知道的有三种方法:

ImageView imageView = ( ImageView ) findViewById ( R . id . xxx ) ;

方法一:使用Runnalbe()来加载
imageView . setBackgroundResource ( R . anim . xxxxx ) ;
final AnimationDrawable animationDrawable = ( AnimationDrawable ) imageView . getBackground () ;
imageView . post ( new Runnable () {
    @
Override
        
public void run ()    {
            
animationDrawable . start () ;
        
}
}) ;

注意:此处一定要用getBackground();不能用getdrawable()方法,会没效果。原因如下:

由于我们使用的是imageView的setBackgroundResource方法设置的资源背景,相当于布局文件中的android:background属性,这个属性是view类的属性,必须通过getBackground()方法来获取;而getdrawable()是imageview类的方法,必须通过在代码中setImageResource(int)(对应布局文件的android:src)setImageDrawable(Drawable drawable)方法设置才可以使用getdrawable()方法。
(详情参考帖子: http://www.eoeandroid.com/forum. ... 1&extra=#pid1627412

方法二:使用AsyncTask异步加载启动
imageView . setBackgroundResource ( R . anim . xxxxx ) ;
AnimationDrawable animationDrawable = ( AnimationDrawable ) imageView . getBackground () ;
RunAnim runAnim = new RunAnim () ;
runAnim . execute ( "" ) ;

class RunAnim extends AsyncTask < String , String , String > {
        @
Override
        
protected String doInBackground ( String ... params ) {
            
if ( ! animationDrawable . isRunning ()) {
               
animationDrawable . stop () ;
               
animationDrawable . start () ;
            
}
            
return "" ;
        
}
}

方法三:通过添加addOnPreDrawListener来自动加载
imageView . setBackgroundResource ( R . anim . xxxxx ) ;
AnimationDrawable animationDrawable = ( AnimationDrawable ) imageView . getBackground () ;
imageView . getViewTreeObserver () . addOnPreDrawListener ( preDrawListener ) ;

OnPreDrawListener preDrawListener = new OnPreDrawListener (){
    @
Override
   
public boolean onPreDraw () {
        
animationDrawable . start () ;
        
return true ; //必须要有这个true返回
   
}
} ;

以上三种方法经过测试没有问题,另外网上有一些说使用重写Activity的onWindowFocusChanged()方法来实现,但是还是有不足,得改变焦点才能触发,虽然理论可以自动实现改变焦点,感觉还是不甚可取。
(http://www.toplee.com/blog/1345.html)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值