项目实战(三):banner加载网络图片,不变形,可缩放可完全显示

简介: 项目实战(三):banner加载网络图片,不变形,可缩放可完全显示

Banner图片加载


在项目中难免会遇到遇到轮播图这种功能需求,而大多数都是用Banner去实现。在项目中尽量从后端获取bannerlist列表数据并进行展示,这样进行更新时只需要后台更改即可,而不需要重新编码,测试,发包,上线。。。


布局代码:


<com.stx.xhb.xbanner.XBanner
                        android:id="@+id/banner"
                        android:layout_width="match_parent"
                        android:layout_height="333dp"
                        app:AutoPlayTime="3000"
                        app:isAutoPlay="true"
                        app:pageChangeDuration="800"
                        app:pointNormal="@drawable/banner_select_no"
                        app:pointSelect="@drawable/banner_select"
                        app:pointsVisibility="true"
                        tools:background="@drawable/icon_img_banner"
                        />

其中app:的属性是自定义属性。在com.stx.xhb.xbanner.XBanner包里的,很多,就不赘述了。


关于自定义属性format的取值,可以去了解一下。


AutoPlayTime="3000":轮播切换时间


isAutoPlay="true":是否轮播


pageChangeDuration="800" 图片切换速度


pointNormal:指定某一资源


pointsVisibility 是否可见


banner实现图片数据绑定:


mBinding.banner.loadImage((banner, model, view, position) -> {
                CouponDetailsMobile.RspdataBean.DetailImageinfolistBean dataMobile = bannerMobiles.get(position);
                if (ObjectUtils.isNotEmpty(dataMobile)) {
                    ImageView imageView = (ImageView) view;
                    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                    RelativeLayout.LayoutParams params= (RelativeLayout.LayoutParams) banner.getLayoutParams();
                    int height=params.height;
                    //占满imageView全部,但图片显示完整 方法一
                    LoadImg.getInstance().loadImg(getActivity, dataMobile.getImg(), imageView, dataMobile.getWidth(), dataMobile.getHeight());
                    //图片显示完整,但是会留白 方法二
//                    LoadImg.getInstance().loadImgBanner(getActivity, dataMobile.getImg(), imageView, dataMobile.getWidth(), dataMobile.getHeight(), height);
                }
            });

loadImage是banner自带的方法,首先从


CouponDetailsMobile.RspdataBean.DetailImageinfolistBean dataMobile = bannerMobiles.get(position)

datamobie获取bannerMobiles.get(position)数据,position是指图片列表里图片的位置,定义一个imageView控件显示图片,

imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

这个setScaleType属性很重要,他决定了图片在容器里如何显示:


属性值网上有很多,这个图不怎么清晰,不过解释的很好,


73b8ccfe1b40e077528265815d3a6be.png


方法一:

LoadImg.getInstance().loadImg(getActivity, dataMobile.getImg(), imageView, dataMobile.getWidth(), dataMobile.getHeight());


方法二

LoadImg.getInstance().loadImgBanner(getActivity, dataMobile.getImg(), imageView, dataMobile.getWidth(), dataMobile.getHeight(), height);

这俩个是封装的方法,第一个方法,不改变ImageView控件的setScaleType属性,图片会居中显示,但是图片显示不完整。


第二个方法,imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);


更改属性,是的图片会按照比例缩放展示图片,不过会留白,具体取向与那个就看个人选择。

/**
     * 图片
     *
     * @param context
     * @param strImg
     * @param imageView
     * @param width     加载图片尺寸,宽,单位px
     * @param height    加载图片尺寸,高,单位px
     */
    public void loadImg(Context context, String strImg, ImageView imageView, int width, int height) {
        if (!ObjectUtils.isEmpty(Utils.checkContext(context))) {
            if (App.DEBUG)
                Log.d("加载图片尺寸", "宽:" + width + "高:" + height);
            GlideApp
                    .with(context)
                    .load(strImg)
                    .placeholder(R.drawable.icon_img_c)
                    .error(R.drawable.icon_img_c_no)
                    .centerCrop()
                    .override(width, height)
                    .into(imageView);
        }
    }


在Gilde方法里设置scaletype无效,记得要先在imageView设置sacleType属性。第二个方法里多用到height属性,是因为banner是固定高度的,传入高度可算出图片显示的宽度。


/**
     * 图片
     *
     * @param context
     * @param strImg
     * @param imageView
     * @param width     加载图片尺寸,宽,单位px
     * @param height    加载图片尺寸,高,单位px
     */
    public void loadImgBanner(Context context, String strImg, ImageView imageView, int width, int height,int parantHeight) {
        if (!ObjectUtils.isEmpty(Utils.checkContext(context))) {
            if (App.DEBUG)
                Log.d("加载图片尺寸", "宽:" + width + "高:" + height);
            int parantWidth;
            imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            parantWidth=(width*parantHeight)/height;
            GlideApp
                    .with(context)
                    .load(strImg)
                    .placeholder(R.drawable.icon_img_c)
                    .error(R.drawable.icon_img_c_no)
                    .override(parantWidth, parantHeight)
                    .fitCenter()
                    .into(imageView);
        }
    }


此外屏幕适配要注意dp和px的转换。网上有很多方法,可以去找找哦,也有封装好的方法可以直接调用。


工作总结,不足之处欢迎指正交流。


相关文章
|
27天前
|
移动开发 TensorFlow 算法框架/工具
只保存和加载网络权重
【8月更文挑战第21天】只保存和加载网络权重。
26 2
|
1月前
|
缓存
Flutter Image从网络加载图片刷新、强制重新渲染
Flutter Image从网络加载图片刷新、强制重新渲染
49 1
|
24天前
|
SQL 网络协议 安全
【Azure API 管理】APIM集成内网虚拟网络后,启用自定义路由管理外出流量经过防火墙(Firewall),遇见APIs加载不出来问题
【Azure API 管理】APIM集成内网虚拟网络后,启用自定义路由管理外出流量经过防火墙(Firewall),遇见APIs加载不出来问题
|
27天前
|
Java Android开发 Kotlin
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
23 0
|
4月前
|
XML JSON 前端开发
【Flutter前端技术开发专栏】Flutter中的图片、视频与网络资源加载
【4月更文挑战第30天】Flutter是谷歌的开源前端框架,因其高性能、流畅UI和多端运行能力受开发者喜爱。本文聚焦于Flutter中的资源加载:使用`Image`组件加载静态、网络和本地图片;通过`video_player`库加载和播放视频;利用`http`包进行网络资源请求。掌握这些技巧将有助于提升Flutter应用的开发效率和质量。
41 0
【Flutter前端技术开发专栏】Flutter中的图片、视频与网络资源加载
|
4月前
|
XML Java Android开发
Android App开发中使用Glide加载网络图片讲解及实战(附源码 简单易懂)
Android App开发中使用Glide加载网络图片讲解及实战(附源码 简单易懂)
235 0
|
编解码 前端开发 JavaScript
响应式图像优化:如何根据用户设备和网络条件优化网页中的图像,以提高用户体验和加载速度。
响应式图像优化:如何根据用户设备和网络条件优化网页中的图像,以提高用户体验和加载速度。
|
数据采集 机器学习/深度学习 PyTorch
【Pytorch神经网络实战案例】34 使用GPT-2模型实现句子补全功能(手动加载)
GPT-2 就是一个语言模型,能够根据上文预测下一个单词,所以它就可以利用预训练已经学到的知识来生成文本,如生成新闻。也可以使用另一些数据进行微调,生成有特定格式或者主题的文本,如诗歌、戏剧。
670 0
|
数据采集 机器学习/深度学习 JSON
【Pytorch神经网络实战案例】32 使用Transformers库的管道方式实现:加载指定模型+文本分类+掩码语言建模+摘要生成+特征提取+阅读理解+实体词识别
在Transformers库中pipeline类的源码文件pipelines.py里,可以找到管道方式自动下载的预编译模型地址。可以根据这些地址,使用第三方下载工具将其下载到本地。
697 0
|
程序员 知识图谱
鸿蒙开发(18)---加载网络图片
鸿蒙开发(18)---加载网络图片
616 0
鸿蒙开发(18)---加载网络图片