Fresco 解决RecycleView 动态宽高比计算图片高度

本文以图片的宽度,屏幕的宽度,动态计算适配图片的高度,以添加到RecyclerView 中,显示不同高度的Item。其他实现可以以此类推出来:
效果如下:
3E001E7F-D118-4AAC-9858-9457CA73F629.png

适用条件:
1. 图片根据手机屏幕宽度,图片自身的比例计算显示的高度,原尺寸显示图片;
2. 因为 fresco 高度不能像ImageVIew一样设置wrap_content;如果设置了wrap_content 代码中手动设置比例才行;
3. 服务器没有返回图片的宽高。手动加载图片,并计算高度。

基于以上条件,可以继续阅读:

1.布局:

 <com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/sdv_result_img"
    android:layout_width="match_parent"
    android:layout_marginTop="10dp"
    android:layout_height="wrap_content"
    fresco:actualImageScaleType="fitCenter"
    fresco:fadeDuration="300"
    />

2.使用:

     ((ImgViewHolder) holder).msdv.setImageURI(mDatas.get(position));
     FrescoUtils.setControllerListener(((ImgViewHolder) holder).msdv, mDatas.get(position),
                UIUtils.getScreenWidth(mcontext));

3.FrescoUtils

public class FrescoUtils {
public static void setControllerListener(final SimpleDraweeView simpleDraweeView, String imagePath, final int imageWidth) {
    final ViewGroup.LayoutParams layoutParams = simpleDraweeView.getLayoutParams();
    ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
        @Override
        public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) {
            if (imageInfo == null) {
                return;
            }
            int height = imageInfo.getHeight();
            int width = imageInfo.getWidth();
            layoutParams.width = imageWidth;
            layoutParams.height = (int) ((float) (imageWidth * height) / (float) width);
            simpleDraweeView.setLayoutParams(layoutParams);
        }

        @Override
        public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
            Log.d("TAG", "Intermediate image received");
        }

        @Override
        public void onFailure(String id, Throwable throwable) {
            throwable.printStackTrace();
        }
    };
    DraweeController controller = Fresco.newDraweeControllerBuilder().setControllerListener(controllerListener).setUri(Uri.parse(imagePath)).build();
    simpleDraweeView.setController(controller);
   }
}

4.getScreenWidth

    public static int getScreenWidth(Context context) {
          WindowManager wm = (WindowManager) context
           .getSystemService(Context.WINDOW_SERVICE);
          DisplayMetrics outMetrics = new DisplayMetrics();
          wm.getDefaultDisplay().getMetrics(outMetrics);
            return outMetrics.widthPixels;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,482评论 25 708
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,809评论 1 92
  • 静静的等待 她害羞似的躲藏在玻璃窗的右上角 黑夜却把她捉了出来 ...
    谷帆阅读 401评论 0 0
  • 1.首先,你电脑必须带有无线网卡,并处于打开状态 2.管理员运行CMD,依次执行以下命令 netsh wlan s...
    AFAP阅读 858评论 0 51
  • 字符串其实就是一组人类可读的字符序列。 -不要在使用过程中更换字符串对象的指向(内存地址) NSString * ...
    香蕉你个菠萝阅读 620评论 0 1