【问题标题】:SimpleDraweeView not resizing after scaling image in fresco在壁画中缩放图像后 SimpleDraweeView 未调整大小
【发布时间】:2018-10-03 21:58:51
【问题描述】:

我正在使用 fresco 在列表视图中显示图像。但是我有一个问题。

当我使用像 CENTER_CROP 这样保持纵横比的方法缩放图像时,缩放图像高度变得小于我的 simpledraweeview 的高度,simple-Drawee-View 不会自动调整大小以匹配缩放图像的大小。

  • 我曾尝试使用android:adjustViewBounds = true 但它不起作用。
  • 我也尝试过下面的方法,但是即使图像高度小于 simpe-drawee-view 的高度,我也想用它来计算缩放高度的 scaleY 返回 1

    float[] f = new float[9]
    draweeView.getImageMatrix().getValues(f);
    float scaleY = f[Matrix.MSCALE_Y];
    Log.d("App","scale y is "+ scaleY);
    

上面的codelet用在下面的方法中

private void loadImage(Uri fileUri,final SimpleDraweeView draweeView,int myImageHeight){

    draweeView.getLayoutParams().width = displayWidth;

    int selectedSize = (myImageHeight > displayWidth)? displayWidth : myImageHeight;

    draweeView.getLayoutParams().height= selectedSize;


    GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(context.getResources());

    GenericDraweeHierarchy hierarchy = builder
            .setProgressBarImage(new CircleProgressBarDrawable())
            .setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP)
            .build();


    ImageRequest requestBuilder = ImageRequestBuilder.newBuilderWithSource(fileUri)
            .setProgressiveRenderingEnabled(true)
            .build();

    //ImagePipeline imagePipeline = Fresco.getImagePipeline();

    DraweeController controller = Fresco.newDraweeControllerBuilder()
            .setOldController(draweeView.getController())
            .setImageRequest(requestBuilder)
            .build();
    draweeView.setHierarchy(hierarchy);
    draweeView.setController(controller);

     float[] f = new float[9]
     draweeView.getImageMatrix().getValues(f);
     float scaleY = f[Matrix.MSCALE_Y];
     Log.d("App","scale y is "+ scaleY);
}

结果:红色表示简单的drawee 视图中未填充图像的部分。这是比例类型 FIT_CENTER。当我使用 CENTER_CROP 时,图像会填满整个图像视图,并且图像的某些部分会被切掉,我不希望这样

问:如何获得缩放的图像大小并使用它来调整我的 simpleDraweeView 的大小,或者换句话说,我怎样才能让我的 simpleDraweeView 调整它的大小?

我将不胜感激。

【问题讨论】:

    标签: android facebook image fresco


    【解决方案1】:

    为了让 simpledraweeview 调整大小,我实现了 ControllerListener 并根据需要更改了 simpleDraweeView 高度。

    private void loadImage(Uri fileUri,final SimpleDraweeView simpeDraweeView) {
    
        GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(context.getResources());
    
        GenericDraweeHierarchy hierarchy = builder
                .setProgressBarImage(new CircleProgressBarDrawable())
                .setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP)
                .build();
    
    
        ImageRequest requestBuilder = ImageRequestBuilder.newBuilderWithSource(fileUri)
                .setProgressiveRenderingEnabled(true)
                .build();
    
    
        ControllerListener<ImageInfo> contollerListener = new BaseContollerListener<ImageInfo>() {
    
        public void onFinalImageSet(String id, ImageInfo imageinfo,Animatable animatable) {
    
            if(imageinfo != null) {
               updateViewSize(imageinfo)
             }
        }
    
        DraweeContoller contoller = Fresco.newDraweeContollerBuilder()
                     .setContollerListener(contollerListener)
                     .setImageRequest(requestBuilder)
                     .build();
    
        simpleDraweeView.setHierarchy(hierarchy);
        simpleDraweeView.setController(contoller);
    
    }
    
    private void updateViewSize(ImageInfo imageinfo){
     //this is my own implementation of changing simple-drawee-view height
     // you canhave yours using imageinfo.getHeight() or imageinfo.getWidth();
     simpleDraweeView.getLayoutParams().height = imageinfo.getHeight();
    
       // don't forget to call this method. thanks to @plamenko for reminding me.
    
       simpleDraweeView.requestLayout()
    }
    

    【讨论】:

    • 我相信你也应该调用simpleDraveeView.requestLayout()。现在这是偶然发生的,因为由于层次结构改变了它的drawable,一个无效事件将随之而来,但最好是明确的。
    • @plamenko 现在更好了。谢谢你帮助我。一切都如我所愿。不过我能问你一些事情吗?是否可以将解码的位图存储在内存缓存或磁盘缓存中?如果是这样,哪个地方更好地获取位图?是内存还是磁盘缓存?我在 fresco 文档中没有找到有关此问题的任何信息。你看,当你使用 Universal Image Loader 时,你可以做到这一点。 fresco 似乎提供了高质量的图像,我想知道如何实现这一点。我需要位图在另一个小图像视图中显示它
    • 您只需使用另一个 SimpleDraweeView。如果图像已经在缓存中,将从那里获取。
    • @tyronen 因此,如果图像路径是sdcard/pictures/tyronen.jpg,我只需将该文件 Uri 传递给 simpledrawee 视图。它将负责检查它是否在内存中。我不必自己手动检查。不是吗?
    • 正确。检查缓存的所有麻烦都由库完成。
    【解决方案2】:

    我强烈建议您阅读 Fresco 文档。您在此处的所有问题都已在此处得到解答。

    Drawee 视图不支持 ImageView 属性(adjustViewBounds、getImageMatrix 等)。请参阅documentation

    再次阅读文档here 中的内在尺寸。

    如果您确实需要动态调整视图的大小,并且存在随之而来的所有缺点,您可以按照here 的说明使用控制器侦听器来做到这一点。

    希望对您有所帮助,如果您还有任何问题,请告诉我。

    【讨论】:

    • 这就是我所做的,它奏效了。我非常感谢您的帮助。 the answer below
    猜你喜欢
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2018-06-15
    • 1970-01-01
    • 2012-02-02
    • 2021-11-22
    相关资源
    最近更新 更多