Android加载Gif动画如何实现?相信大家都很好奇,本文就为大家揭晓,内容如下

Android加载Gif动画实现代码_第1张图片

<?xml version="1.0" encoding="utf-8"?>      
        

主界面

package com.example.gifdemo;  import android.app.Activity; import android.os.Bundle;  public class MainActivity extends Activity {  private GifView gif1;   @Override  public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  gif1 = (GifView) findViewById(R.id.gif1);  // 设置背景gif图片资源  gif1.setMovieResource(R.raw.red);  }  } 

自定义view

package com.example.gifdemo;  import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Movie; import android.os.Build; import android.util.AttributeSet; import android.view.View;  public class GifView 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 GifView(Context context) {  this(context, null);  }   public GifView(Context context, AttributeSet attrs) {  this(context, attrs,0);  }   public GifView(Context context, AttributeSet attrs, int defStyle) {  super(context, attrs, defStyle);  setViewAttributes(context, attrs, defStyle);  setBackgroundColor(Color.parseColor("#FFB6C1"));  }   @SuppressLint("NewApi")  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.GifView);  mMovieResourceId = array.getResourceId(R.styleable.GifView_gif, -1);  mPaused = array.getBoolean(R.styleable.GifView_paused, false);  array.recycle();  if (mMovieResourceId != -1) {  mMovie = Movie.decodeStream(getResources().openRawResource(   mMovieResourceId));  }  }   /**  * 设置gif图资源  */  public void setMovieResource(int movieResId) {  this.mMovieResourceId = movieResId;  mMovie = Movie.decodeStream(getResources().openRawResource(  mMovieResourceId));  requestLayout();  }   @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  if (mMovie != null) {  //gif动画的宽度、高度  int movieWidth = mMovie.width();  int movieHeight = mMovie.height();  //控件的宽度  int maximumWidth = MeasureSpec.getSize(widthMeasureSpec);  //gif图片宽/控件宽  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 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();  }    @SuppressLint("NewApi")  private void invalidateView() {  if (mVisible) {  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {  postInvalidateOnAnimation();  } else {  invalidate();  }  }  }      // --------------------以下方法未调用------------------------------------/  public void setMovie(Movie movie) {  this.mMovie = movie;  requestLayout();  }   public Movie getMovie() {  return mMovie;  }   public void setMovieTime(int time) {  mCurrentAnimationTime = time;  invalidate();  }   public void setPaused(boolean paused) {  this.mPaused = paused;  if (!paused) {  mMovieStart = android.os.SystemClock.uptimeMillis()   - mCurrentAnimationTime;  }  invalidate();  }   public boolean isPaused() {  return this.mPaused;  }   @SuppressLint("NewApi")  @Override  public void onScreenStateChanged(int screenState) {  super.onScreenStateChanged(screenState);  mVisible = screenState == SCREEN_STATE_ON;  invalidateView();  }   @SuppressLint("NewApi")  @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();  }  // --------------------------------------------------------/ } 

源码下载:http://xiazai.jb51.net/201610/yuanma/AndroidGifDemo(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多相关文章

  1. Android 控件之一:Button 按钮
  2. android 中动态创建控件
  3. Android自定义view三验证码输入控件
  4. 时间控件
  5. Android 欢迎界面淡出动画效果(Animation)
  6. Android 动态生成多行多列控件
  7. Android抖动动画
  8. Android Q自定义开关机动画

随机推荐

  1. 参考:修改android开机界面
  2. Android实战——Mp3播放器
  3. Android(安卓)ART Hook 实现 - SandHook
  4. Android(安卓)Intent学习笔记
  5. Android中String资源文件的String.format
  6. Android Handler 消息机制
  7. 【Android 性能优化】应用启动优化 ( 安
  8. 史上最详细的Android系统SystemUI 启动过
  9. Kotlin 概览——如何看待 Google 将 Kotl
  10. [Android] [ Android启动流程 ] [ 下 ] [