首页 > 系统 > Android > 正文

Android加载Gif动画实现代码

2019-12-12 04:51:30
字体:
来源:转载
供稿:网友

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

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  android:orientation="vertical" >   <com.example.gifdemo.GifView  android:id="@+id/gif1"  android:layout_width="100dp"  android:layout_height="100dp"  android:layout_gravity="center_horizontal"  android:enabled="false" />  </LinearLayout>
 <declare-styleable name="GifView">  <attr name="gif" format="reference" />  <attr name="paused" format="boolean" />  </declare-styleable> 

主界面

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.VeVB.COm/201610/yuanma/AndroidGifDemo(VeVB.COm).rar

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表