2019独角兽企业重金招聘Python工程师标准>>>

在上一篇,是使用代码通过构造方法传入要播放的gif动画的id进行获取的。本文进一步改造,让GifView和ImageView一样可以在布局文件中设置src属性,并在GifView中我们使用反射动态获取src的图片资源ID,然后对它进行播放。这样使用起来就灵活多了。代码如下:

GifView:

package com.home.gifview;import java.io.InputStream;
import java.lang.reflect.Field;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.ImageView;public class GifView extends ImageView {private Movie movie;private long movieStart;private int imageWidth;private int imageHeight;public GifView(Context context) {super(context);}public GifView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public GifView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.GifView);int resourceId = getResourceId(a, context, attrs);if (resourceId != 0) {InputStream is = getResources().openRawResource(resourceId);movie = Movie.decodeStream(is);if (movie != null) {Bitmap bitmap = BitmapFactory.decodeStream(is);imageWidth = bitmap.getWidth();imageHeight = bitmap.getHeight();bitmap.recycle();}}}@Overrideprotected void onDraw(Canvas canvas) {if (movie == null) {// 普通图片则直接调用父类的onDraw()方法super.onDraw(canvas);} else {playGif(canvas);invalidate();}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);if (movie != null) {// 如果是gif图片则定制GifView的大小setMeasuredDimension(imageWidth, imageHeight);}}/*** 播放gif动画* * @param canvas* @return*/private boolean playGif(Canvas canvas) {long now = SystemClock.uptimeMillis();if (movieStart == 0) {movieStart = now;}int duration = movie.duration();if (duration == 0) {duration = 1000;}int relTime = (int) ((now - movieStart) % duration);movie.setTime(relTime);movie.draw(canvas, 0, 0);if ((now - movieStart) >= duration) {movieStart = 0;return true;}return false;}/*** 使用反射,获取到src指定图片资源所对应的id。* * @param a* @param context* @param attrs* @return*/private int getResourceId(TypedArray a, Context context, AttributeSet attrs) {try {Field field = TypedArray.class.getDeclaredField("mValue");field.setAccessible(true);TypedValue typedValueObject = (TypedValue) field.get(a);return typedValueObject.resourceId;} catch (Exception e) {e.printStackTrace();} finally {if (a != null) {a.recycle();}}return 0;}
}

attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="GifView"></declare-styleable></resources>

main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><com.home.gifview.GifViewandroid:id="@+id/main_gifView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:src="@drawable/loading" /></RelativeLayout>

禁用硬件加速:

android:hardwareAccelerated="false"

转载于:https://my.oschina.net/secyaher/blog/274414

android中播放gif动画之二相关推荐

  1. android如何播放动画,Android中播放Gif动画取巧的办法

    由于做的项目,要有个动画的等待效果,第一时间想到的就是Gif(懒,省事),但是试了好多据说能播放Gif的控件,也写过,但是放到魅族手机上就是不能播放,所有就想了个招,既然Gif能在浏览器上播放,那an ...

  2. android中播放gif动画之三

    之前写了些简单的类基本可以实现gif的播放,主要是使用的Movie类来解决的.今天无意中在网上看到有个开源小项目GifView可以用来解析播放GIF,名字居然跟我写的控件一样,呵呵,看了源码,实现方式 ...

  3. android中播放gif动画之一

    在android中默认的控件是不支持gif格式的图片的,只能显示图片的第一帧,这里需要借助于Movie类.将图片进行解析播放.下面使用一种纯代码的自定义控件,这种方式使用方便,但不支持像ImageVi ...

  4. android中设置Animation 动画效果

    在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现,一种是 tweened animation 渐变动画,另一种是 frame by frame animation ...

  5. 在Powerbuilder中播放Flash动画

    在Powerbuilder中播放Flash动画. w_flash.ole_1.object.movie=gs_apppath+"\pic1\泵.swf" w_flash.ole_1 ...

  6. android 3.0 m3u8,在Android中播放m3u8视频

    我想直播视频,并且它采用m3u8格式.所以,我想下面的代码在Android中播放m3u8视频 public class StreamingPlayer extends Activity impleme ...

  7. Android中播放音乐的几种方式

    Android中播放音乐的几种方式 前言 前几天一直在研究RxJava2,也写了记录了几篇博客,但因为工作任务原因,需要研究音频相关的知识,暂时放下Rxjava,本文的demo中,MediaPalye ...

  8. DataGridView单元格中播放gif动画的变通方法(转自:博客园蜡人张)

    WinForm应用程序中如何在DataGridView的某一列中播放gif动画,单纯添加一个DataGridViewImageColumn列是不行的,显示出来的图片只是gif动画的一帧,是静止的.在不 ...

  9. Android中的属性动画

    1.属性动画简介 接下来我们学习Android动画中的第三种动画--属性动画(Property Animation) Animation一般动画就是我们前面学的帧动画和补间动画!Animator则是本 ...

最新文章

  1. 机器学习如何计算特征的重要性_机器学习之特征缩放
  2. linux系统的交换分区怎么分配?
  3. java的ThreadLocal类的使用方法
  4. Mybatis中jdbcType和javaType的对应关系
  5. gjr garch Matlab,基于Copula-ARIMA-GJR-GARCH模型的股票指数相关性分析
  6. (转载)mysql 用drop和delete方法删除用户的区别
  7. 2019年最佳Python学习路线
  8. iOS开发 UILabel实现自适应高宽
  9. python append函数 循环_Python中循环后使用list.append数据被覆盖问题的解决
  10. 一步一步写算法(之prim算法 下)
  11. 杀死系统中的进程kill和killall命令
  12. ThreeJS 实现等值线效果
  13. 分享一个蛋白互作网站——String (一)
  14. TM4C123-使用ROM中的函数库
  15. sql :统计各个状态总数_博客状态:统计信息和更新
  16. 安卓java模拟器跳过付费,不用花钱买android手机,电脑端Android模拟器安装使用教程...
  17. 2020阿里巴巴社招面试题
  18. 编程语言是一种逻辑语言(形式语言)
  19. 共享充电线项目市场分析报告
  20. 大面积无线网络覆盖5大方案,满足不同场所的实际需求

热门文章

  1. usb 进入suspend_USB的挂起和唤醒 (Suspend and Resume)
  2. 事物的级别_面试官问:MySQL锁与事物隔离级别你知道吗?
  3. springboot requestmapping 正则_SpringBoot实现优雅的后端接口
  4. 企业服务器虚拟化方案文档,服务器虚拟化在企业中的应用
  5. Java不满足的依赖异常_不要依赖代码中的异常
  6. java什么是最终类型_golang和java,谁才是最终答案?
  7. aws 部署python lambda_python - 如何使用Aws Lambda(python)接收文件 - 堆栈内存溢出
  8. css3鼠标果果变手型代码_css3 鼠标悬浮动画效果
  9. LeetCode-175. 组合两个表(SQL语句中的LEFT JOIN)
  10. 信息系统项目管理师优秀论文:论信息系统范围管理02