Android - Как показать GIF в течение ограниченного времени? - PullRequest
1 голос
/ 14 марта 2019

У меня есть приложение Android, которое показывает экран с анимированным GIF изображением во время загрузки. Изображение отображается вечно или отображается только на пустом экране, если я использую таймер . Я просто хочу показать это в течение 5 секунд. Как отобразить GIF только на 5 секунд?

С этим кодом изображение отображается вечно:

public class MainActivity extends AppCompatActivity {

public GifImageView gifImageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    gifImageView = (GifImageView) findViewById(R.id.GifImageView);
    gifImageView.setGifImageResource(R.drawable.gif2);
}

}

С этим кодом изображение в формате gif не отображается, отображается только пустой экран, но через 5 секунд приложение закрывается:

public class MainActivity extends AppCompatActivity {

public GifImageView gifImageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    gifImageView = (GifImageView) findViewById(R.id.GifImageView);
    startCountDownTimer();
}

private void startCountDownTimer() {
    new CountDownTimer( 5000, 5000 ) {
        public void onTick(long millisUntilFinished) {
            gifImageView.setGifImageResource(R.drawable.gif2);
        }
        public void onFinish() {
            finish();
        }
    }.start();
}
* *} Тысяча двадцать-один

Вот код GifImageView:

public class GifImageView extends View {

private InputStream mInputStream;
private Movie mMovie;
private int mWidth, mHeight;
private long mStart;
private Context mContext;

public GifImageView(Context context) {
super(context);
this.mContext = context;
}

public GifImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public GifImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
if (attrs.getAttributeName(1).equals("background")) {
    int id = Integer.parseInt(attrs.getAttributeValue(1).substring(1));
    setGifImageResource(id);
}
}


private void init() {
setFocusable(true);
mMovie = Movie.decodeStream(mInputStream);
mWidth = mMovie.width();
mHeight = mMovie.height();
requestLayout();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(mWidth, mHeight);
}

@Override
protected void onDraw(Canvas canvas) {
long now = SystemClock.uptimeMillis();
if (mStart == 0) {
    mStart = now;
}

if (mMovie != null) {
    int duration = mMovie.duration();
    if (duration == 0) {
        duration = 1000;
    }

    int relTime = (int) ((now - mStart) % duration);
    mMovie.setTime(relTime);
    mMovie.draw(canvas, 0, 0);
    invalidate();
}
}

public void setGifImageResource(int id) {
mInputStream = mContext.getResources().openRawResource(id);
init();
}

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вы можете использовать CountDownTimer, установить время на 5000 milliseconds.Когда вызывается onFinish(), вы можете перестать отображать GIF.Используйте этот код:

new CountDownTimer(5000, 5000) {

    public void onTick(long millisUntilFinished) {
        // You don't need to use this.
    }

    public void onFinish() {
        // Put the code to stop the GIF here.
    }

}.start();

Подробнее о CountDownTimers можно прочитать в документации .

0 голосов
/ 15 марта 2019

С помощью @AmeerTaweel вы можете использовать CountDownTimer. Другой простой подход - использовать Handler для этого в методе onCreate(), например:

new Handle().postDelayed(new Runnable(
    @Override
    public void run() {
        ImageView.setVisibility(View.GONE); //Or the GIF View
    }
), 5000); //5 sec
...