项目(showgif)已推到GitHub,查看文末的链接即可下载。

显示如下一张Gif动态图片:

看一下在demo中的效果:

按钮用来暂停和继续。看一下代码逻辑实现:

package com.zms.showgif;

import android.support.v7.app.ActionBarActivity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

public class Main extends ActionBarActivity {

private GifImageView gifImageView;

private Button btnPause;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

gifImageView = (GifImageView) findViewById(R.id.imgGif);

gifImageView.setMovieResource(R.raw.showme);

btnPause = (Button) findViewById(R.id.btnPause);

btnPause.setOnClickListener(new OnClickListenerImp());

}

private class OnClickListenerImp implements View.OnClickListener {

@Override

public void onClick(View v) {

if (v == btnPause) {

if (gifImageView.isPaused()) {

gifImageView.setPaused(false);

btnPause.setText("Pause");

} else {

gifImageView.setPaused(true);

btnPause.setText("Play");

}

}

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

int id = item.getItemId();

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

}

核心的自定义View:

package com.zms.showgif;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.graphics.Movie;

import android.os.Build;

import android.util.AttributeSet;

import android.view.View;

/**

* Created by AlexZhou on 2015/1/29.

* 16:42

*/

public class GifImageView extends View {

// 默认为1秒

private static final int DEFAULT_MOVIE_DURATION = 1000;

private int mMovieResourceId;

private Movie mMovie;

private long mMovieStart;

private int mCurrentAnimationTime = 0;

private float mLeft;

private float mTop;

private float mScale;

private int mMeasuredMovieWidth;

private int mMeasuredMovieHeight;

private boolean mVisible = true;

private volatile boolean mPaused = false;

public GifImageView(Context context) {

this(context, null);

}

public GifImageView(Context context, AttributeSet attrs) {

this(context, attrs, R.styleable.Gif_style);

}

public GifImageView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

setViewAttributes(context, attrs, defStyle);

}

private void setViewAttributes(Context context, AttributeSet attrs,

int defStyle) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

}

// 从描述文件中读出gif的值,创建出Movie实例

final TypedArray array = context.obtainStyledAttributes(attrs,

R.styleable.Gif, defStyle, -1);

mMovieResourceId = array.getResourceId(R.styleable.Gif_resource, -1);

mPaused = array.getBoolean(R.styleable.Gif_paused, false);

array.recycle();

if (mMovieResourceId != -1) {

mMovie = Movie.decodeStream(getResources().openRawResource(

mMovieResourceId));

}

}

public int setMovieResource(int movieResId) {

this.mMovieResourceId = movieResId;

mMovie = Movie.decodeStream(getResources().openRawResource(

mMovieResourceId));

requestLayout();

return movieResId;

}

public void setMovie(Movie movie) {

this.mMovie = movie;

requestLayout();

}

public Movie getMovie() {

return mMovie;

}

public void setMovieTime(int time) {

mCurrentAnimationTime = time;

invalidate();

}

/**

* 设置暂停

*

* @param paused

*/

public void setPaused(boolean paused) {

this.mPaused = paused;

if (!paused) {

mMovieStart = android.os.SystemClock.uptimeMillis()

- mCurrentAnimationTime;

}

invalidate();

}

/**

* 判断gif图是否停止了

*

* @return

*/

public boolean isPaused() {

return this.mPaused;

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

if (mMovie != null) {

int movieWidth = mMovie.width();

int movieHeight = mMovie.height();

int maximumWidth = MeasureSpec.getSize(widthMeasureSpec);

float scaleW = (float) movieWidth / (float) maximumWidth;

mScale = 1f / scaleW;

mMeasuredMovieWidth = maximumWidth;

mMeasuredMovieHeight = (int) (movieHeight * mScale);

setMeasuredDimension(mMeasuredMovieWidth, mMeasuredMovieHeight);

} else {

setMeasuredDimension(getSuggestedMinimumWidth(),

getSuggestedMinimumHeight());

}

}

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

super.onLayout(changed, l, t, r, b);

mLeft = (getWidth() - mMeasuredMovieWidth) / 2f;

mTop = (getHeight() - mMeasuredMovieHeight) / 2f;

mVisible = getVisibility() == View.VISIBLE;

}

@Override

protected void onDraw(Canvas canvas) {

if (mMovie != null) {

if (!mPaused) {

updateAnimationTime();

drawMovieFrame(canvas);

invalidateView();

} else {

drawMovieFrame(canvas);

}

}

}

private void invalidateView() {

if (mVisible) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {

postInvalidateOnAnimation();

} else {

invalidate();

}

}

}

private void updateAnimationTime() {

long now = android.os.SystemClock.uptimeMillis();

// 如果第一帧,记录起始时间

if (mMovieStart == 0) {

mMovieStart = now;

}

// 取出动画的时长

int dur = mMovie.duration();

if (dur == 0) {

dur = DEFAULT_MOVIE_DURATION;

}

// 算出需要显示第几帧

mCurrentAnimationTime = (int) ((now - mMovieStart) % dur);

}

private void drawMovieFrame(Canvas canvas) {

// 设置要显示的帧,绘制即可

mMovie.setTime(mCurrentAnimationTime);

canvas.save(Canvas.MATRIX_SAVE_FLAG);

canvas.scale(mScale, mScale);

mMovie.draw(canvas, mLeft / mScale, mTop / mScale);

canvas.restore();

}

@Override

public void onScreenStateChanged(int screenState) {

super.onScreenStateChanged(screenState);

mVisible = screenState == SCREEN_STATE_ON;

invalidateView();

}

@Override

protected void onVisibilityChanged(View changedView, int visibility) {

super.onVisibilityChanged(changedView, visibility);

mVisible = visibility == View.VISIBLE;

invalidateView();

}

@Override

protected void onWindowVisibilityChanged(int visibility) {

super.onWindowVisibilityChanged(visibility);

mVisible = visibility == View.VISIBLE;

invalidateView();

}

}

转载请注明出处:周木水的CSDN博客 http://blog.csdn.net/zhoumushui

我的GitHub:周木水的GitHub https://github.com/zhoumushui

原文:http://blog.csdn.net/zhoumushui/article/details/43274581

android gif动态显示,Android 显示Gif 动态图片相关推荐

  1. android 最新 九宫格,Android开发中怎么显示一个九宫格图片

    Android开发中怎么显示一个九宫格图片 发布时间:2020-11-21 15:09:33 来源:亿速云 阅读:86 作者:Leah 本篇文章给大家分享的是有关Android开发中怎么显示一个九宫格 ...

  2. Android中显示gif动态图片

    在android中显示一个静态图片比如png jpg等等都很方便,但是如果要显示一个gif 动态图片就需要进行一些处理. 本文是采用自定义view 然后进行重新onDraw方法来实现 首先自定义Vie ...

  3. Android三步显示gif动态图片

    1.把GifView.jar加入你的项目. 2.在布局xml中这样写: [html] view plaincopyprint? <com.ant.liao.GifView android:id= ...

  4. vue 动态获取的图片路径不显示_Vue 动态图片加载路径问题和解决方法

    最近在做一个树形结构的组件,使用了Vue和element UI中el-tree组件.因为树中每个节点都需要显示一个图标图片,并且需要根据后台传入的数据类型动态地显示,所以图片的路径需要动态地加载.下面 ...

  5. C# WinForm显示GIF动态图片

    用WinForm自带的Label: AutoSize属性设置为false: Text属性为空: Image属性指定GIF图片: ImageAlign属性设置图片位置:

  6. c android显示gif动画,MFC显示GIF动画图片

    本帖则将讨论如何在MFC的对话框里显示GIF动画图片.一些关于传统控件的美化方法正在研究当中会陆续发帖的. 这是本帖用到的一个VS2008例程. 附件  GifPicture.rar (138.1 K ...

  7. android动画入门,Android动画之入门篇(一)

    作为Android开发者,动画是非常重要的知识点,本文主要从入门角度来探索动画. Android的动画主要包括三大类:逐帧(Frame)动画,补间(Tween)动画,属性动画. 1. 逐帧(Frame ...

  8. android 撕衣服,Android初体验之撕衣服项目

    一.准备工作 start 一个新的安卓工程 --->选择Empty Activity----->给工程起一个名字叫tearcloth ------->选择Java语言-------- ...

  9. android 点动态显示图片,Android用RecyclerView实现动态添加本地图片

    本文介绍了Android用RecyclerView实现动态添加本地图片,分享给大家,具体如下: 简单介绍一下用法: 1.跳转到图片选择页面: Intent intent = new Intent(Pa ...

最新文章

  1. ♥看二本学渣如何进腾讯 分享面试经验、职场感悟、硬核知识、大厂内推♥
  2. 数据不平衡的解决办法
  3. java jackson json_java – 使用Jackson从JSON获取单个字段
  4. MySQL--数据库基础
  5. 计算图片相似度的方法
  6. CDateTimeUI类源码分析
  7. html5新增表单控件和表单属性
  8. java同步通信_java-线程-线程同步通信技术
  9. 视频编解码(一):编解码器cedarc/libcedarx编译工具链配置
  10. python编写arcgis脚本教程_零基础学习ArcGIS Python脚本开发视频课程
  11. 4k视频分辨率的码流_4k分辨率普通码率和蓝光1080p高码率视频,到底哪个体验好?...
  12. 【通俗易懂的通信】贝叶斯公式 全概率公式 及其理解
  13. 如何在 Linux 上安装服务器程序?
  14. Mac解决Updating Homebrew卡顿
  15. 在物联网领域,英特尔除了高速计算的芯片,还提供了什么技术?
  16. 海洋cms php环境 多少,海洋cms
  17. 微信小程序开发之表单验证(WxValidate使用)
  18. UE4 坐标转换 之 CAD 坐标转UE
  19. Discovering Relations among Named Entities from Large Corpora
  20. 《Unity着色器和屏幕特效开发秘笈》—— 第3章 利用镜面反射让游戏闪耀起来...

热门文章

  1. 视频帧率(Frame rate)
  2. IDS入侵检测系统与开源IDS-snort的安装与编写规则
  3. android Stopwatch实例
  4. 第二次计算机水平考试是什么,第二次计算机二级考试试题及答案
  5. 【电子电路基础实验】LED点阵(上--硬件部分)
  6. docker仓库Repository和harbor仓库
  7. Wireshark分析DHCP
  8. Unity学习-配置vuforia
  9. http://www.iefans.net/ie6-ie7-ie8-ieduobanben
  10. 张勋说:耐磨钢球简介