您的位置:首页 > 移动开发 > Android开发

Android显示GIF动画的几种方法

2013-05-09 01:05 387 查看
参考:
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: