当前位置:操作系统 > 安卓/Android >>

Android PowerImageView实现,可以播放动画的强大ImageView

我个人是比较喜欢逛贴吧的,贴吧里总是会有很多搞笑的动态图片,经常看一看就会感觉欢乐很多,可以释放掉不少平时的压力。确实,比起一张单调的图片,动态图片明显更加的有意思。一般动态图片都是GIF格式的,浏览器中可以直接将这种格式的图片播放成动画。
 
不过很可惜的是,Android的原生控件并不支持播放GIF格式的图片。我们都知道,在Android中如果想要显示一张图片,可以借助ImageView控件来完成,但是如果将一张GIF图片设置到ImageView里,它只会显示这张图片的第一帧,不会产生任何的动画效果。
 
那么就没有办法在Android里播放GIF图片了吗?当然不是,我们可以通过自定义控件的方式来实现这个功能。ImageView无法播放GIF图片说明它的功能还不够强大,那么今天我们就来编写一个PowerImageView控件,让它既能支持ImageView控件原生的所有功能,同时还可以播放GIF图片。
 
下面我们就开始吧,首先新建一个项目,起名就叫PowerImageViewTest,这里使用Android 4.0的API。
 
由于是要自定义控件,我们还可能会用到一些自定义的属性,因此在values目录下新建一个attrs.xml的文件,可以在这个文件中添加任何需要自定义的属性。这里我们目前只需要一个auto_play属性,代码如下所示:
 
[html] 
<?xml version="1.0" encoding="utf-8"?>  
<resources>  
  
    <declare-styleable name="PowerImageView">  
        <attr name="auto_play" format="boolean"></attr>  
    </declare-styleable>  
  
</resources>  
完成了这个文件之后,下面我们来开始编写最最重要的PowerImageView类,由于这个类要支持ImageView的所有功能,因此需要让PowerImageView继承自ImageView,代码如下所示:
[java] 
public class PowerImageView extends ImageView implements OnClickListener {  
  
    /** 
     * 播放GIF动画的关键类 
     */  
    private Movie mMovie;  
  
    /** 
     * 开始播放按钮图片 
     */  
    private Bitmap mStartButton;  
  
    /** 
     * 记录动画开始的时间 
     */  
    private long mMovieStart;  
  
    /** 
     * GIF图片的宽度 
     */  
    private int mImageWidth;  
  
    /** 
     * GIF图片的高度 
     */  
    private int mImageHeight;  
  
    /** 
     * 图片是否正在播放 
     */  
    private boolean isPlaying;  
  
    /** 
     * 是否允许自动播放 
     */  
    private boolean isAutoPlay;  
  
    /** 
     * PowerImageView构造函数。 
     *  
     * @param context 
     */  
    public PowerImageView(Context context) {  
        super(context);  
    }  
  
    /** 
     * PowerImageView构造函数。 
     *  
     * @param context 
     */  
    public PowerImageView(Context context, AttributeSet attrs) {  
        this(context, attrs, 0);  
    }  
  
    /** 
     * PowerImageView构造函数,在这里完成所有必要的初始化操作。 
     *  
     * @param context 
     */  
    public PowerImageView(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PowerImageView);  
        int resourceId = getResourceId(a, context, attrs);  
        if (resourceId != 0) {  
            // 当资源id不等于0时,就去获取该资源的流  
            InputStream is = getResources().openRawResource(resourceId);  
            // 使用Movie类对流进行解码  
            mMovie = Movie.decodeStream(is);  
            if (mMovie != null) {  
                // 如果返回值不等于null,就说明这是一个GIF图片,下面获取是否自动播放的属性  
                isAutoPlay = a.getBoolean(R.styleable.PowerImageView_auto_play, false);  
                Bitmap bitmap = BitmapFactory.decodeStream(is);  
                mImageWidth = bitmap.getWidth();  
                mImageHeight = bitmap.getHeight();  
                bitmap.recycle();  
                if (!isAutoPlay) {  
                    // 当不允许自动播放的时候,得到开始播放按钮的图片,并注册点击事件  
                    mStartButton = BitmapFactory.decodeResource(getResources(),  
                            R.drawable.start_play);  
                    setOnClickListener(this);  
                }  
            }  
        }  
    }  
  
    @Override  
    public void onClick(View v) {  
        if (v.getId() == getId()) {  
            // 当用户点击图片时,开始播放GIF动画  
            isPlaying = true;  
            invalidate();  
        }  
    }  
  
    @Override  
    protected void onDraw(Canvas canvas) {  
        if (mMovie == null) {  
            // mMovie等于null,说明是张普通的图片,则直接调用父类的onDr
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,