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属性很重要,他决定了图片在容器里如何显示:
属性值网上有很多,这个图不怎么清晰,不过解释的很好,
方法一:
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的转换。网上有很多方法,可以去找找哦,也有封装好的方法可以直接调用。
工作总结,不足之处欢迎指正交流。