Android Glide和Firebase存储:从Firebase存储到Imageview加载连续图像 - 闪烁

时间:2017-06-16 16:43:01

标签: android firebase android-glide

我正在努力实现从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(),但都没有显示出任何改进。

1 个答案:

答案 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<>();