博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 屏幕适配一:通过自定义View的方式实现适配
阅读量:6419 次
发布时间:2019-06-23

本文共 3946 字,大约阅读时间需要 13 分钟。

实现原理:以一个特定的宽度尺寸的设备为参考,在View加载的过程中,根据当前设备的实际像素换算出目标像素,再作用到控件上。

通常UI给我们的设计稿只有一种像素的标准,例如720 * 1280。 例如在设计稿上有一个控件宽度为屏幕尺寸的一半,即360px,假设我们真机的屏幕尺寸为1080 * 1920像素,我们再布局中设置控件尺寸也为360px,则显示为屏幕的三分之一。但是我们想要效果仍然是显示屏幕的一半。即宽度应该设置为540px,这里的540px是如何得到的呢,这就是通过真实屏幕尺寸与参考设计稿的尺寸比例来得到的,即:(1080/720)*360 = 540。

下面通过代码来实现这一功能:

public class Utils {    private static Utils utils;    //这是设计稿参考的宽高    private static final float STANDARD_WIDTH = 720;    private static final float STANDARD_HEIGHT = 1080;    //这里是屏幕的显示宽高    private int mDisPlayWidth;    private int mDisPlayHeight;    public static Utils getInstance(Context context) {        if (utils == null) {            utils = new Utils(context.getApplicationContext()); //获取application的context是防止内存泄漏        }        return utils;    }    private Utils(Context context) {        //获取屏幕的宽高        if (mDisPlayHeight == 0 || mDisPlayWidth == 0) { //宽高还未赋值            WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);            if (manager != null) {                DisplayMetrics displayMetrics = new DisplayMetrics();                manager.getDefaultDisplay().getMetrics(displayMetrics); //此时displayMetrics就可以获取到屏幕宽高信息了                if (displayMetrics.widthPixels > displayMetrics.heightPixels) {                    //横屏                    mDisPlayWidth = displayMetrics.heightPixels;                    mDisPlayHeight = displayMetrics.widthPixels - getStatusBarHeight(context);                } else {                    //竖屏                    mDisPlayWidth = displayMetrics.widthPixels;                    mDisPlayHeight = displayMetrics.heightPixels - getStatusBarHeight(context);                }            }        }    }    //获取状态栏高度    public int getStatusBarHeight(Context context) {        int resID = context.getResources().getIdentifier("status_bar_height", "dimen", "android");        if (resID > 0) { //可以获取到状态栏高度            return context.getResources().getDimensionPixelSize(resID);        }        return 0;    }    //获取水平方向的缩放比例    public float getHorizontalScale() {        return mDisPlayWidth / STANDARD_WIDTH;    }    //获取垂直方向的缩放比例    public float getVerticalScale() {        return mDisPlayHeight / STANDARD_HEIGHT;    }}复制代码

Utils工具类用来计算设计稿屏幕分辨率和真实屏幕分辨率的比例。

下面以RelativeLayout为例:

public class ScreenAdapterLayout extends RelativeLayout {    private boolean flag;    public ScreenAdapterLayout(Context context) {        super(context);    }    public ScreenAdapterLayout(Context context, AttributeSet attrs) {        super(context, attrs);    }    public ScreenAdapterLayout(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        //计算宽高之前获取缩放比例的值        if (!flag) { //防止比例的计算多次调用            float scaleX = Utils.getInstance(getContext()).getHorizontalScale();            float scaleY = Utils.getInstance(getContext()).getVerticalScale();            int count = getChildCount();            for (int i = 0; i < count; i++) {                View child = getChildAt(i);                LayoutParams params = (LayoutParams) child.getLayoutParams();                params.width = (int) (params.width * scaleX);                params.height = (int) (params.height * scaleY);                params.leftMargin = (int) (params.leftMargin * scaleX);                params.rightMargin = (int) (params.rightMargin * scaleX);                params.topMargin = (int) (params.leftMargin * scaleY);                params.bottomMargin = (int) (params.leftMargin * scaleY);            }            flag = true;        }        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }}复制代码

下面在资源布局中使用ScreenAdapterLayout。

这里我设置的宽度为360px,我手机的像素为1080*2248,但是显示的view的宽度仍然为屏幕的一半。这是因为根据Utils把view的宽高做了换算。我们不需要关注真实屏幕的分辨率。只需要根据设计稿的分辨率来设置view的宽高。

注:博主菜鸡一个,第一次写博客,希望得到大佬的指点。轻点喷o(╥﹏╥)o

转载于:https://juejin.im/post/5c94eddbe51d45155076b238

你可能感兴趣的文章
[Delphi] 字节序交换函数
查看>>
nvm 安装及使用
查看>>
实现线程池(一)线程池的基本概念
查看>>
网络流之最大流
查看>>
微信授权登录(yii)
查看>>
Jquery Easy UI--datagrid的使用(转)
查看>>
场景编辑器CocosBuilder使用教程
查看>>
告别忙碌
查看>>
Springboot学习01- 配置文件加载优先顺序和本地配置加载
查看>>
网页缓存技术
查看>>
js修改页面动态添加input框显示与按钮可编辑
查看>>
SSH整合报错:找不到元素 'beans' 的声明
查看>>
REST及RESTful的实现
查看>>
正则化
查看>>
P1437 [HNOI2004]敲砖块
查看>>
nginx 配置https
查看>>
libcurl理解和使用
查看>>
简易博客开发(8)----django1.9 博客部署到pythonanywhere上
查看>>
客户端 post ,get 访问服务器
查看>>
css绘制三角形
查看>>