我正在努力实现从firebase存储中连续下载图片到Android应用程序中的imageView。 到目前为止,我成功但结果或多或少可怕,因为更新图像会导致闪烁,即两个图像之间的空白图像。
我将最新的图片路径存储在节点" state / recentPicture"中的firebase实时数据库中。每次更新我通过ValueEventListener在我的Android应用程序中获取它,然后通过滑动更新我的图像视图。图片的帧率为每秒3帧。 我的代码看起来像这样:
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页面复制图像加载器类: FirebaseImageLoader from FirebaseUI
我在想,在开始将它们放入我的imageview之前,我可能需要缓冲多个图像。
有没有更好的建议。从长远来看,我想"模拟视频流"通过静止图像。图像或多或少是实时图像。也许使用firebase数据库和firebase存储的整个方法都是错误的。如果您有任何更好的建议,我会很高兴听到它们。
作为我想补充的附加信息,imageview位于片段中。我也尝试省略了crossfade函数,也使用了dontAnimate()和dontTransform(),但都没有显示出任何改进。
答案 0 :(得分: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<>();