我有一个自定义视图,我在其中播放GIF,实际上是一个Loader。每当我进行后台工作时,我都会将GIF视图可见性设置为ON,并在工作完成时将其可见性设置为已消失。以下是我的Custom GifLoader java代码。
public class GifLoader extends View {
private InputStream gifInputStream;
private Movie gifMovie;
private int movieWidth, movieHeight;
private long movieDuration;
private long mMovieStart;
public GifLoader(Context context) {
super(context);
init(context);
}
public GifLoader(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public GifLoader(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context){
setFocusable(true);
gifInputStream = context.getResources()
.openRawResource(R.drawable.loading);
gifMovie = Movie.decodeStream(gifInputStream);
movieWidth = gifMovie.width();
movieHeight = gifMovie.height();
movieDuration = gifMovie.duration();
}
@Override
protected void onMeasure(int widthMeasureSpec,
int heightMeasureSpec) {
setMeasuredDimension(movieWidth, movieHeight);
}
public int getMovieWidth(){
return movieWidth;
}
public int getMovieHeight(){
return movieHeight;
}
public long getMovieDuration(){
return movieDuration;
}
@Override
protected void onDraw(Canvas canvas) {
long now = android.os.SystemClock.uptimeMillis();
if (mMovieStart == 0) { // first time
mMovieStart = now;
}
if (gifMovie != null) {
int dur = gifMovie.duration();
if (dur == 0) {
dur = 100;
}
int relTime = (int)((now - mMovieStart) % dur);
gifMovie.setTime(relTime);
gifMovie.draw(canvas, 0, 0);
invalidate();
}
}
}
这是我的XML代码。
<yas.life.utils.GifLoader
android:visibility="gone"
android:layout_centerInParent="true"
android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
现在的问题是,GIFview在其可见性消失时正在运行,每当我将其可见性设置为可见时,进度已经在运行,而不是从其初始状态开始。我想要做的是GIFloader应该从它的初始状态开始。 无论如何,每当我将可见性设置为可见或任何其他方式来实现此目的时,都会重新启动此自定义GIF视图。
答案 0 :(得分:2)
尝试重新绘制调用invalidate()
https://developer.android.com/reference/android/view/View.html#invalidate()
答案 1 :(得分:0)
我认为Movie.setTime(0)
可以解决您的问题。
答案 2 :(得分:0)
您可以检查onDraw()
中的视图可见性状态,并在视图消失时将gif时间设置为0