【问题标题】:Android Glide and Firebase Storage: Load Consecutive Images from Firebase Storage to Imageview - FlickeringAndroid Glide 和 Firebase 存储:将连续图像从 Firebase 存储加载到 Imageview - 闪烁
【发布时间】:2017-06-16 16:43:00
【问题描述】:

我正在尝试实现将图片从 firebase 存储连续下载到 android 应用程序中的 imageView 中。 到目前为止,我成功了,但结果或多或少很糟糕,因为更新图像会导致闪烁,即两个图像之间的空白图像。

我将最近的图片路径存储在节点“state/recentPicture”中的 Firebase 实时数据库中。每次更新时,我都会通过 ValueEventListener 在我的 android 应用程序中获取它,然后通过 glide 更新我的图像视图。图片的帧率为每秒 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

我在想,在开始将它们放入我的图像视图的过程之前,我可能需要缓冲多个图像。

有没有更好的建议。从长远来看,我想通过静止图像“模拟视频流”。这些图像或多或少是实时图像。也许使用 firebase 数据库和 firebase 存储的整个方法是错误的。如果您有更好的建议,我会很高兴听到。

作为我想补充的附加信息,图像视图位于片段中。我也已经尝试省略交叉淡入淡出功能,也使用了 dontAnimate() 和 dontTransform(),但都没有任何改进。

【问题讨论】:

    标签: android firebase android-glide


    【解决方案1】:

    找到了解决办法: 我正在使用资源就绪和 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<>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2018-11-21
      • 2020-12-24
      • 2018-09-03
      • 2017-01-12
      • 2017-10-11
      • 2021-05-30
      相关资源
      最近更新 更多