国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android顯示GIF圖片實(shí)例代碼

2019-10-22 18:11:46
字體:
供稿:網(wǎng)友

最近.一個(gè)朋友跟我說想,我給她弄個(gè)鬧鐘APP軟件...功能其實(shí)很簡單...只需要弄個(gè)簡單的鬧鐘.自己設(shè)計(jì)設(shè)計(jì)時(shí)間.然后時(shí)間到了的時(shí)候,鬧鈴放的聲音是男朋友錄制好的聲音...于是就開始整了....

第一次做這種的時(shí)候.我想把首頁界面做成一個(gè)GIF動畫特效的.這樣看起來可愛點(diǎn)...適合妹子用,于是就有了下面這個(gè)效果圖

android,顯示GIF圖片,GIF圖片

上代碼

ndroid中的Android.graphics.Movie 這個(gè)類,這是android提供給我們的一個(gè)非常方便的工具。
首先,重寫控件View,自定義一個(gè)展示gif圖的GifView
Movie其實(shí)管理著GIF動畫中的多個(gè)幀,只需要通過 setTime() 一下就可以讓它在draw()的時(shí)候繪出相應(yīng)的那幀圖像。通過當(dāng)前時(shí)間與duration之間的換算關(guān)系,是很容易實(shí)現(xiàn)GIF動起來的效果。

public class GifView extends View {  /**  * 默認(rèn)為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, R.styleable.CustomTheme_gifViewStyle);  }  public GifView(Context context, AttributeSet attrs, int defStyle) {  super(context, attrs, defStyle);  setViewAttributes(context, attrs, defStyle);  }  @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的值,創(chuàng)建出Movie實(shí)例  final TypedArray array = context.obtainStyledAttributes(attrs,   R.styleable.GifView, defStyle, R.style.Widget_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));  }  }  /**  * 設(shè)置gif圖資源  *  * @param movieResId  */  public void setMovieResource(int movieResId) {  this.mMovieResourceId = movieResId;  mMovie = Movie.decodeStream(getResources().openRawResource(   mMovieResourceId));  requestLayout();  }  public void setMovie(Movie movie) {  this.mMovie = movie;  requestLayout();  }  public Movie getMovie() {  return mMovie;  }  public void setMovieTime(int time) {  mCurrentAnimationTime = time;  invalidate();  }  /**  * 設(shè)置暫停  *  * @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);   }  }  }  @SuppressLint("NewApi")  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();  // 如果第一幀,記錄起始時(shí)間  if (mMovieStart == 0) {   mMovieStart = now;  }  // 取出動畫的時(shí)長  int dur = mMovie.duration();  if (dur == 0) {   dur = DEFAULT_MOVIE_DURATION;  }  // 算出需要顯示第幾幀  mCurrentAnimationTime = (int) ((now - mMovieStart) % dur);  }  private void drawMovieFrame(Canvas canvas) {  // 設(shè)置要顯示的幀,繪制即可  mMovie.setTime(mCurrentAnimationTime);  canvas.save(Canvas.MATRIX_SAVE_FLAG);  canvas.scale(mScale, mScale);  mMovie.draw(canvas, mLeft / mScale, mTop / mScale);  canvas.restore();  }  @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();  }  } 

其次,在xml布局文件中,把這個(gè)view定義進(jìn)去,代碼如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:layout_width="fill_parent"   android:layout_height="fill_parent"   android:background="#ffffff"   android:gravity="center"   android:orientation="vertical"  >   <com.example.alarmtest.GifView  android:id="@+id/gif1"  android:layout_width="300dp"  android:layout_height="300dp"  android:layout_gravity="center_horizontal"  android:enabled="false"/>  <Button  android:id="@+id/bu"  android:text="進(jìn)入"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_gravity="center_horizontal"/>  </LinearLayout> 

最后,在MainActivity中的使用,代碼如下:

public class FirstActivity extends Activity {  private GifView gif;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_first);  gif = (GifView) findViewById(R.id.gif1);  // 設(shè)置背景gif圖片資源  gif.setMovieResource(R.raw.a123);  } } 

Styles.xml

<declare-styleable name="GifView">  <attr name="gif" format="reference" />  <attr name="paused" format="boolean" />  </declare-styleable>  <declare-styleable name="CustomTheme">  <attr name="gifViewStyle" format="reference" />  </declare-styleable>  <style name="Widget_GifView"></style> 

raw是res下面的一個(gè)文件放的是GIF動畫圖噢

我這里放了一個(gè)動畫圖 跟一個(gè) 音樂文件,因?yàn)槲乙龅氖且粋€(gè)有聲音的鬧鈴

android,顯示GIF圖片,GIF圖片

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新龙县| 衡水市| 盐津县| 塘沽区| 襄汾县| 乌拉特后旗| 宝兴县| 永和县| 罗城| 桃源县| 叶城县| 禄劝| 塘沽区| 遵义县| 信阳市| 常宁市| 包头市| 定结县| 伊通| 绥宁县| 三江| 汉沽区| 鹤岗市| 禄丰县| 康保县| 辽中县| 吴江市| 庆元县| 长泰县| 新余市| 深圳市| 象山县| 伊金霍洛旗| 襄樊市| 连江县| 尖扎县| 洞头县| 蚌埠市| 仁怀市| 聂拉木县| 钦州市|