屏幕适配,banner图根据比例适配

4,553 阅读2分钟

先看一下首页的效果图:

可以看到顶部有一个banner轮播,既然是banner图,那么宽度肯定是match_parent,那么高度要怎么设置才能使手机上的图片不会拉伸变形呢?

一、在android机型适配中,app\src\main\res文件夹下面有文件夹:

mipmap-mdpi、mipmap-hdpi、mipmap-xhdpi、mipmap-xxhdpi、mipmap-xxxhdpi。

分别代表不同 dpi 屏幕所使用的图片。根据不同分辨率将图片放入相对应的路径下

1.这里推荐大家一个非常好用的工具

蓝湖 - 高效的产品设计协作平台 lanhuapp.com/web/#/user/…

介绍一下蓝湖的使用:选中一张图片,在页面右侧顶部,选择android平台,可以直接下载各个分辨率的图片,点击下载当前切图或者查看所有切图,就可以把所有同一张图的所有分辨率下的图片都下载下来,然后根据路径,放入相应的文件目录下即可。

二、即使是这样,banner控件也需要指定一个高度,可以看到蓝湖上显示banner图的高度是222dp

那么我们把高度直接设置为222dp可以吗?

答案:并不能完全解决图片拉伸问题

既然这样的话,只有在代码中动态改变banner控件的高度了,那么如何来指定呢?

重点拉咯!!!!

使用比例:

1.首先我们可以动态获取屏幕的宽度和高度 2.可以知道,蓝湖上显示的banner图的宽高比是:375/222 3.现在已知屏幕宽度width=getDisplayWidth();则动态获取banner图的宽度为width=getDisplayWidth(); 4.假设banner的高度为h 5.好了,列个算式:width/h=375/222,可得h=222/375*width;

解释一下:这样做的好处,图片的宽高比例永远是375/222,图片也不能变形的很夸张。

当然,UI在做banner图的时候就必须严格按照这个比例,不然不同比例的图片放上去,依然是会变形的,要配合好每一步哦!!!!!

获取屏幕宽高的代码如下:

    /**
     * 得到屏幕的宽度
     */
    public static int getDisplayWidth() {
        try {
            WindowManager wm = (WindowManager) App.getInstance().getSystemService(Context.WINDOW_SERVICE);
            return wm.getDefaultDisplay().getWidth();
        } catch (Exception e) {
            return 1080;
        }
    }

    /**
     * 得到屏幕的宽度
     */
    public static int getDisplayHeight() {
        try {
            WindowManager wm = (WindowManager) App.getInstance().getSystemService(Context.WINDOW_SERVICE);
            return wm.getDefaultDisplay().getHeight();
        } catch (Exception e) {
            return 1080;
        }
    }

设置banner控件的高度,代码如下:

    private void setBannerHeight(BannnerViewHolder viewHolderTop){
        int widthDensity = DensityUtil.getDisplayWidth();
        LinearLayout.LayoutParams linearParams =(LinearLayout.LayoutParams) viewHolderTop.layoutTop.getLayoutParams(); //取控件textView当前的布局参数
        float height = (float)225/(float)375 * (float) widthDensity;
        linearParams.height = (int)height;// 控件的高强制设成20
        linearParams.width = widthDensity;// 控件的宽强制设成30
        viewHolderTop.layoutTop.setLayoutParams(linearParams); //使设置好的布局参数应用到控件
    }