Android載入Gif動畫實現代碼_Android

來源:互聯網
上載者:User

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

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.