2017-06-16 76 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<>();