Android GIF 渲染问题
Posted
技术标签:
【中文标题】Android GIF 渲染问题【英文标题】:Android GIF rendering issues 【发布时间】:2016-03-31 17:28:12 【问题描述】:在我的 activity_main.xml 文件中,我有以下代码块,因为我想用它来为我的 GIF 文件制作动画。
<matthewallenlinsoftware.keepy_uppy.PlayGifView
android:layout_
android:layout_
android:id="@+id/viewGif"
android:layout_gravity="center"
android:layout_weight="0.04"
android:src="@drawable/bouncing_ball" />
GIF 的动画效果很好,但这会导致 Android Studio 出现渲染问题。有解决办法吗?
PlayGifView 的代码如下:
public class PlayGifView extends View
private static final int DEFAULT_MOVIEW_DURATION = 1000;
private int mMovieResourceId;
private Movie mMovie;
private long mMovieStart = 0;
private int mCurrentAnimationTime = 0;
@SuppressLint("NewApi")
public PlayGifView(Context context, AttributeSet attrs)
super(context, attrs);
/**
* Starting from HONEYCOMB have to turn off HardWare acceleration to draw
* Movie on Canvas.
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
public void setImageResource(int mvId)
this.mMovieResourceId = mvId;
mMovie = Movie.decodeStream(getResources().openRawResource(mMovieResourceId));
requestLayout();
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
if(mMovie != null)
setMeasuredDimension(mMovie.width(), mMovie.height());
else
setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight());
@Override
protected void onDraw(Canvas canvas)
if (mMovie != null)
updateAnimtionTime();
drawGif(canvas);
invalidate();
else
drawGif(canvas); //NULLPTR EXCEPTION
private void updateAnimtionTime()
long now = android.os.SystemClock.uptimeMillis();
if (mMovieStart == 0)
mMovieStart = now;
int dur = mMovie.duration();
if (dur == 0)
dur = DEFAULT_MOVIEW_DURATION;
mCurrentAnimationTime = (int) ((now - mMovieStart) % dur);
private void drawGif(Canvas canvas)
mMovie.setTime(mCurrentAnimationTime); //NULLPTR EXCEPTION
mMovie.draw(canvas, 0, 0);
canvas.restore();
【问题讨论】:
那么 PlayGifView 类是你的吗?问题可能出在那个代码上,所以发布它。 @weston 我对其进行了编辑以包含该课程。 【参考方案1】:如果您将 GIF 保存在 hdpi、xhdpi 等文件夹中。也可以直接将 GIF 复制到“drawable”中或尝试以管理员身份运行 android studio...
【讨论】:
你能澄清你的意思吗?我的 GIF 在“drawable”文件夹中。看来问题在于我没有将小部件拖放到布局预览上来表示我的 GIF,因此这可能是导致问题的原因。在这种情况下,我必须将 GIF 作为 ImageView 吗?【参考方案2】:如果使用不同的库没有问题,那么你可以试试这个
Droids on Roids
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.22'
和***build.gradle
buildscript
repositories
mavenCentral()
allprojects
repositories
mavenCentral()
在你看来 XML
<pl.droidsonroids.gif.GifImageView
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:src=”@drawable/src_anim”
android:background=”@drawable/bg_anim”/>
如果需要在线下载功能,可以试试Glide
repositories
google()
mavenCentral()
dependencies
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
然后从 URL 加载
Glide.with(this).load(“your_gif.gif") .into(imageView);
从资源中加载
Glide.with(this).load(R.raw.your_gif).into(imageView);
【讨论】:
以上是关于Android GIF 渲染问题的主要内容,如果未能解决你的问题,请参考以下文章
Android 如何在 android 本地通知中添加视频和 GIF?