Android-GIF图片显示
来源:互联网 发布:在线财神网淘宝店 编辑:程序博客网 时间:2024/05/16 04:55
摘自博客:
在Android中显示GIF动画
在这里主要用的是:android中的android.graphics.Movie 这个类,这是android提供给我们的一个非常方便的工具。
Movie其实管理着GIF动画中的多个帧,只需要通过 setTime() 一下就可以让它在draw()的时候绘出相应的那帧图像。通过当前时间与duration之间的换算关系,是很容易实现GIF动起来的效果。
1、自定义view:
package com.example.lenovo.myapplication.activity;import android.annotation.SuppressLint;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;import com.example.lenovo.myapplication.R;/** * Created by lenovo on 2017/7/4. */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, 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的值,创建出Movie实例 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)); } } /** * 设置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(); } /** * 设置暂停 * * @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(); // 如果第一帧,记录起始时间 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") @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(); }}
2、res/value/attrs:
<?xml version="1.0" encoding="utf-8"?><resources> <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></resources>
3、布局:
<com.example.lenovo.myapplication.activity.GifView android:id="@+id/gif1" android:layout_width="match_parent" android:layout_height="222dp" android:layout_gravity="center_horizontal" android:enabled="false" /> <com.example.lenovo.myapplication.activity.GifView android:id="@+id/gif2" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center_horizontal" android:enabled="false" />
4、使用:
/** * Created by lenovo on 2017/7/4. */public class MainActivityII extends AppCompatActivity { private GifView gif1, gif2; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); gif1 = (GifView) findViewById(R.id.gif1); // 设置背景gif图片资源 gif1.setMovieResource(R.raw.boliang); gif2 = (GifView) findViewById(R.id.gif2); gif2.setMovieResource(R.raw.boliang); // 设置暂停 gif2.setPaused(true); }}
遇到问题:
1、未设置抗锯齿:
private void drawMovieFrame(Canvas canvas) { // 设置要显示的帧,绘制即可 mMovie.setTime(mCurrentAnimationTime); canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG| Paint.FILTER_BITMAP_FLAG));//在此方法中为canvas添加抗锯齿 canvas.save(Canvas.MATRIX_SAVE_FLAG); canvas.scale(mScale, mScale); mMovie.draw(canvas, mLeft / mScale, mTop / mScale); canvas.restore(); }
参考:Android画图之抗锯齿paint和Canvas两种方式实例
设置抗锯齿方法:
方法一:给Paint加上抗锯齿标志。然后将Paint对象作为参数传给canvas的绘制方法。
paint.setAntiAlias(true);
方法二:给Canvas加上抗锯齿标志。
有些地方不能用paint的,就直接给canvas加抗锯齿,更方便。
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
阅读全文
0 0
- android 显示gif图片
- android显示gif图片
- Android显示GIF图片
- android显示gif图片
- android 显示gif图片
- android显示GIF图片
- Android显示gif图片
- Android显示GIF图片
- android 显示gif图片
- Android显示GIF图片
- Android显示Gif图片
- android 显示gif图片
- android显示gif图片
- Android gif图片显示
- Android-GIF图片显示
- Android APIDemo gif图片显示
- android显示gif图片(上)
- Android显示gif格式图片
- 【RMQ】poj 3264 Balanced Lineup
- 获取sd卡某路径下的图片,并展示出来
- 用三元运算符判断奇数和偶数(学习)
- linux_command_list
- 理解双飞翼布局
- Android-GIF图片显示
- HDU-1548
- ubuntu编译FFMPEG报错ERROR: x265 not found using pkg-config
- 流媒体学习2
- git 分支
- ffmpeg 滤镜及其效果
- 网络判断
- Hadoop MR &MRv2(YARN)编程模型
- A-Z随机步法