如何在Android中重画视图

如何在Android中重画视图,android,android-layout,Android,Android Layout,我有一个自定义视图,在其中我播放GIF,它实际上是一个加载程序。每当我做后台工作时,我都会将GIF视图的可见性设置为ON,并在工作完成时将其可见性设置为gone。下面是我的自定义GifLoader java代码 public class GifLoader extends View { private InputStream gifInputStream; private Movie gifMovie; private int movieWidth, movieHeig

我有一个自定义视图,在其中我播放GIF,它实际上是一个加载程序。每当我做后台工作时,我都会将GIF视图的可见性设置为ON,并在工作完成时将其可见性设置为gone。下面是我的自定义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在其可见性消失时正在运行,每当我将其可见性设置为visible时,进度已经在运行,而不是从其初始状态开始。我想做的是,GIFloader应该从它的初始状态开始。
无论何时我将可见性设置为visible或任何其他方式来实现此目的,是否都可以重新启动此自定义GIF视图。

我认为可能会解决您的问题。

我认为可能会解决您的问题。

尝试重新绘制视图调用
invalidate()


尝试重新绘制视图,调用
invalidate()


您可以在
onDraw()
中检查视图的可见性状态,并在视图消失时将gif时间设置为0

您可以在
onDraw()中检查视图的可见性状态,并在视图消失时将gif时间设置为0

在再次设置可见之前调用init。调用init不起作用try setEnabled(false);当您将其隐藏时。在设置为再次可见之前调用init。调用init不起作用try setEnabled(false);当您隐藏它时。您是否尝试在再次显示GIF视图之前调用init()然后使其无效?不只是调用invalidateDid您尝试在再次显示GIF视图之前调用init()然后使其无效?不只是调用invalidate