【问题标题】:Android GIF rendering issuesAndroid GIF 渲染问题
【发布时间】:2016-03-31 17:28:12
【问题描述】:

在我的 activity_main.xml 文件中,我有以下代码块,因为我想用它来为我的 GIF 文件制作动画。

<matthewallenlinsoftware.keepy_uppy.PlayGifView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    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 我对其进行了编辑以包含该课程。

标签: android android-layout android-studio gif animated-gif


【解决方案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);

【讨论】:

    猜你喜欢
    • 2016-07-06
    • 2013-08-14
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多