IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 屏幕适配方案 -> 正文阅读

[移动开发]屏幕适配方案

1:资源文件适配方案

drawable(追我博):可曳的,可拉的

在drawable和layout文件后添加屏幕的尺寸,如下:

drawable-320x320 ,layout-320x320

drawable-336x367 , layout-336x367

该方案适合屏幕大小固定为几种的设备

2:固定屏幕适配方案

1:固定像素大小适配方案

Metrics(麦揣科斯):度量;指标;量度;度量指标;衡量标准

给出参考屏幕(1920*1080),通过windowManager.getDefaultDisplay().getMetrics(displayMetrics);获取到当前设备的真实长宽(注意长度需要去掉状态栏高度如:2340*1080),然后计算出在当前屏幕下的需要拉伸或者缩小的长宽缩放比,然后,通过视图给出的像素,进行缩放计算,得出真实屏幕的像素大小,再把该像素大小放入到视图的布局参数中。

基于该方法,可以衍生出UIRelativeLayout&UILinearLayout适配性布局

1:获取状态栏的两种方法

//1:状态栏高度获取方法
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;
}
//2:通过反射获取到状态栏高度
private int getSystemBarHeight(Context context){
    return getValue(context,"com.android.internal.R$dimen","system_bar_height",48);
}
private int getValue(Context context, String dimeClass, String system_bar_height, int defaultValue) {
//        com.android.internal.R$dimen    system_bar_height   状态栏的高度
    try {
        Class<?> clz= Class.forName(dimeClass);
        Object object = clz.newInstance();
        Field field=clz.getField(system_bar_height);
        int id= Integer.parseInt(field.get(object).toString());
        return context.getResources().getDimensionPixelSize(id);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return defaultValue;
}

2:设备端的真实长宽获取方式

private UIUtils(Context context) {
//        计算缩放系数
    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics displayMetrics=new DisplayMetrics();
    if(displayMetricsWidth==0.0f || displayMetricsHeight==0.0f){
        //在这里得到设备的真实值
        windowManager.getDefaultDisplay().getMetrics(displayMetrics);
        systemBarHeight=getStatusBarHeight(context);
        //横屏
        if(displayMetrics.widthPixels>displayMetrics.heightPixels){
            this.displayMetricsWidth=(float)(displayMetrics.heightPixels);
            this.displayMetricsHeight=(float)(displayMetrics.widthPixels-systemBarHeight);
        }else {
            //                竖屏
            this.displayMetricsWidth=(float)(displayMetrics.widthPixels);
            this.displayMetricsHeight=(float)(displayMetrics.heightPixels-systemBarHeight);
        }
        //            状态栏
    }
}

3:衍生工具类:UIRelativeLayout实现原理,重新改viewGroup的onMeasure方法,遍历子View,更新子View的布局参数

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (flag) {
        flag = false;
        float scaleX = UIUtils.getInstance(getContext()).getHorizontalScaleValue();
        float scaleY = UIUtils.getInstance(getContext()).getVerticalScaleValue();
        int childCount = this.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = this.getChildAt(i);
            LayoutParams layoutParams = (LayoutParams) child.getLayoutParams();
            layoutParams.width=(int) (layoutParams.width * scaleX);
            layoutParams.height = (int) (layoutParams.height * scaleY);
            layoutParams.leftMargin = (int) (layoutParams.leftMargin * scaleX);
            layoutParams.rightMargin = (int) (layoutParams.rightMargin * scaleX);
            layoutParams.topMargin = (int) (layoutParams.topMargin * scaleY);
            layoutParams.bottomMargin = (int) (layoutParams.bottomMargin * scaleY);
         }
        }
    }

3:通用图片处理方案

1:.9png图片处理

在android studio中,把需要拉伸的png图片(注意一定要是png图片),修改名称,后缀添加.9(如aaa.9.png),然后双击该图片,打开后,或看到左下角有9patch选项,选择该功能,就可以打开如下的视图,在该视图中进行编辑,以完成可拉伸的效果的图片,需要注意的是,左侧和上边是控制可拉伸区域,建议拉伸的像素为1像素,这样不会导致拉伸内容遮盖和拉伸失真的问题

image.png

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-05 20:23:48  更:2021-07-05 20:24:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 13:54:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码