2016-07-18 2 views
0

У меня есть пользовательский вид, в котором я играю в GIF, который на самом деле является загрузчиком. Всякий раз, когда я выполняю фоновые работы, я устанавливаю GIF View visibility в положение ON и устанавливаю его видимость, когда работа будет завершена. Ниже приведен код java-кода пользовательского GifLoader.Как перерисовать вид в Android

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 начинал с исходного состояния. В любом случае, чтобы перезапустить этот пользовательский GIFview, когда я устанавливаю видимость видимым или любым другим способом для этого.

+0

вызова инициализации, прежде чем снова установить видимыми. –

+0

Вызов init не работает –

+0

try setEnabled (false); когда вы его скрываете. – David

ответ

1

Попробуйте перерисовать ваш взгляд, призывающего invalidate()

https://developer.android.com/reference/android/view/View.html#invalidate()

+0

Я думал, что это сработает, но его не работает –

+0

Вы пытались вызвать init(), а затем invalidate(), прежде чем снова показать GIF-представление? –

+0

Нет Просто вызвана недействительной –

0

Вы можете проверить состояние зрения видимости в onDraw() и установите время в формате GIF на 0, когда вид исчезло

Смежные вопросы