2017-06-16 58 views
0

我想實現到consecutivly從火力存儲下載的圖片轉換成ImageView的Android應用中。 到目前爲止,我成功了,但結果或多或少都很糟糕,因爲更新圖像會導致閃爍,即兩張圖像之間出現空白圖像。安卓滑翔和火力地堡貯存:負荷火力地堡存儲連續圖像來的ImageView - 閃爍

我存儲在節點「狀態/ recentPicture」一個火力點實時數據庫的最新圖片路徑。每次更新時,我都會通過ValueEventListener在Android應用中獲取它,然後通過滑動更新圖像視圖。圖片的幀率是每秒3幀。 我的代碼lookes這樣的: FirebaseImageLoader from FirebaseUI

我想,也許我需要在啓動的過程之前緩衝多張圖片:

mFirebaseDatabase.child("state").child("recentPicture").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.d("Picture Update:",dataSnapshot.toString()); 
      String imgPath = dataSnapshot.getValue(String.class); 
      mStorageRef = FirebaseStorage.getInstance().getReference().child(imgPath); 
      Glide.with(getContext()) 
        .using(new FirebaseImageLoader()) 
        .load(mStorageRef) 
        .fitCenter() 
        .crossFade() 
        .into(mImageView); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

的圖像加載類是直接從firebaseUI GitHub的頁面複製把它們放到我的imageview中。

有沒有人更好的建議。從長遠來看,我想通過靜止圖像來「模擬視頻流」。圖像或多或少都是實時圖像。也許整個使用Firebase數據庫和Firebase存儲的方法都是錯誤的。如果你有更好的建議,我會很高興聽到他們。

正如我想補充,該ImageView的駐留在片段上的附加信息。我也已經嘗試省略crossfade函數,並且還使用了dontAnimate()和dontTransform(),但都沒有顯示出任何改進。

回答

0

找到了解決辦法: 我使用的資源準備和SimpleTarget。下載路徑緩存在ArrayList中。

值監聽器看起來是這樣的。

mFirebaseDatabase.child("state").child("recentPicture").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.d("Picture Update:",dataSnapshot.toString()); 
      String imgPath = dataSnapshot.getValue(String.class); 
      if (imgPath!= null) mPictures.add(imgPath); 
      if (mPictures.size()==1){ 
       mStorageRef = FirebaseStorage.getInstance().getReference().child(imgPath); 
       Glide.with(getContext()) 
         .using(new FirebaseImageLoader()) 
         .load(mStorageRef) 
         .asBitmap() 
         .fitCenter() 
         .into(target); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

簡單目標是這樣的:

private SimpleTarget target = new SimpleTarget<Bitmap>() { 

    @Override 
    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
     mImageView.setImageBitmap(resource); 

     if(mPictures.size()>=1){ 
      String imgPath = mPictures.get(0); 
      Log.d("Printing picture:",imgPath); 
      mPictures.remove(0); 
      mStorageRef = FirebaseStorage.getInstance().getReference().child(imgPath); 
      Glide.with(getContext()) 
        .using(new FirebaseImageLoader()) 
        .load(mStorageRef) 
        .asBitmap() 
        .fitCenter() 
        .into(target); 
     } 

    } 
}; 

並對圖像的路徑存儲在一個私有字段:

private ArrayList<String> mPictures = new ArrayList<>();