关于屏幕适配之比例布局

2023-05-16

对于平板等需求场合,它们的屏幕比例以16:10和16:9等为主,

但是屏幕尺寸各异,分辨率各异,即便是同一尺寸也有多种分辨率,

这种时候无论是使用dp还是px,相对布局还是线性布局,都达不到效果。

但是比例布局在这种情况下能较好地适配。

 

首先看一下使用自定义控件实现比例布局:

谷歌已经实现了比例布局中的PercentRelativeLayout和PercentFrameLayout,

其余的要自己实现,例如PercentTextView等

 

谷歌实现的类的代码在SDK路径下就有PercentRelativeLayout.java,PercentFrameLayout.java,PercentLayoutHelper.java以及attrs.xml

先来看一下attrs.xml中的属性


<declare-styleable name="PercentLayout_Layout">
        <attr name="layout_widthPercent" format="fraction"/>

        <attr name="layout_heightPercent" format="fraction"/>

        <attr name="layout_marginPercent" format="fraction"/>
        <attr name="layout_marginLeftPercent" format="fraction"/>
        <attr name="layout_marginTopPercent" format="fraction"/>
        <attr name="layout_marginRightPercent" format="fraction"/>
        <attr name="layout_marginBottomPercent" format="fraction"/>
        <attr name="layout_marginStartPercent" format="fraction"/>
        <attr name="layout_marginEndPercent" format="fraction"/>
        <attr name="layout_aspectRatio" format="fraction" />
</declare-styleable>  

例如父wiew使用PercentRelativeLayout

子view就可以使用这些属性了,而且自定义view可以嵌套,例如


<android.support.percent.PercentRelativeLayout
        android:id="@+id/titlebar"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_heightPercent="6.75%"
        app:layout_widthPercent="100%"
        android:background="@drawable/titlebar" >

        <android.support.percent.PercentTextView
            android:id="@+id/texttitle"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_heightPercent="77.7777778%"
            app:layout_marginLeftPercent="0.39%"
            app:layout_marginTopPercent="10%"
            app:layout_widthPercent="15.390625%"
            android:background="@drawable/titletextbk"
            android:gravity="center"
            android:textColor="@android:color/white"
            android:textSize="26px" />

        <ImageView
            android:id="@+id/listmode"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_heightPercent="81.4814815%"
            app:layout_marginLeftPercent="19.14%"
            app:layout_marginTopPercent="10%"
            app:layout_widthPercent="5.15625%"
            android:background="@drawable/listpage"
            android:clickable="true"
            android:focusable="true"
            android:onClick="listmodeOnClick" />
......  

其中layout_aspectRatio这个属性并不能让布局保持原始比例缩放,而是强制保持某个指定的比例

当需要比例的textview的时候,就需要自定义了

继承TextView,主要是重写了setTextSize()方法,并在构造方法中调用了它

以上是针对布局的比例布局

在使用针对布局的比例布局时候遇到过ScrollView下不能放比例布局的问题,只好撤去ScrollView

 

接下来说一下代码中的比例布局:

思路在于得到屏幕分辨率与标准(例如1280)的比例


public class Util {
    String TAG = "Util";
    private static float ratio = 1f;
    
    private static int getWidthPix(Activity activity) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay()
                .getMetrics(displayMetrics);
        int widthPixels = displayMetrics.widthPixels;
        return widthPixels;
    }
    /**
     * 得到分辨率比例,要在initRatio执行之后执行
     * @param context
     * @return
     */
    public static float getRatio(){
        return ratio;
    }

    public static void initRatio(Activity activity) {
        float nowWidthPix = getWidthPix(activity);
        Log.e("aaa","nowWidthPix:"+ nowWidthPix);
        ratio = nowWidthPix/1280;
        
    }  

因为必须传入activity,所以initRatio在MainActivity的OnCreate方法中,一开始就执行,(至于其它得到屏幕分辨率的方法中使用application的context行不行还没试过)

然后在需要得到比例的地方使用getRatio即可

接下来在代码中控制控件的大小和位置,使用px,并乘以或者除以ratio即可达到比例布局的效果(注:有的图片特殊需要作ratio^2运算)

 

综合以上两类方法,可以解决比例布局的大部分需求

 

转载于:https://www.cnblogs.com/BlogCommunicator/p/8968836.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于屏幕适配之比例布局 的相关文章

  • 深度学习之 人脸识别(1) 人脸预处理

    人脸识别分两个部分 xff1a 第一步 xff1a 人脸图片预处理 xff0c 即检测图片中人脸并裁剪成指定尺寸的人脸图 第二步 xff1a 人脸识别 xff0c 包括模型训练 目标人脸分类训练 预测目标人脸 1 人脸检测原理 人脸识别 x
  • 制作自己的个人网站方法

    随着个人创业的流行 xff0c 很多个人也需要一个比较详细的网站来展示自己 xff0c 开展个人业务 xff0c 或者积累粉丝等等 那么怎么制作自己的个人网站呢 xff1f 又该怎么制作得更个性好看 xff1f 下面就跟大家分享下制作方法
  • 傻瓜书,VMware里的Ubuntu

    转自 xff1a http bbs cnw com cn thread 136057 1 1 html 傻瓜书 xff0c VMware里的Ubuntu 0 预备知识 什么是Ubuntu 如果不了解这一点 xff0c 本文的内容似乎与您无关
  • 痞子衡单片机排行榜(2022Q4)

    痞子衡单片机排行榜 2022Q4 继2020年开办的 痞子衡嵌入式半月刊 之后 xff0c 从2023年1月份开始痞子衡将为大家带来新项目 痞子衡单片机排行榜 一年分四季 xff0c 每个季度发布一期 xff0c 以MCU主频和Corema
  • [pdf]使用spire读取PDF的文字和图片

    概述 最近在梳理某项目的数据标准 xff0c 从标准网下载了很多PDF格式的标准文件 xff0c 需要提取文字和图片 xff0c 所以写了个程序提取 xff1b 本文使用了免费版的Spire 约束 免费版的Spire一次只能提取PDF的10
  • JetPack系列之ViewBinding

    viewBinding的作用启用视图绑定Activity中使用视图绑定Framgent中使用视图绑定与findViewById相比 viewBinding的作用 启用视图绑定之后 xff0c 系统会为每个xml生成一个绑定类 xff0c 我
  • 正则表达式记录

    去掉所有非1到9或者字母的其它字符 private static String dealWithVersion String versionArg String regex 61 34 1 9a zA Z 34 versionArg 61
  • 批量kill掉带有某些标识的进程的shell命令

    微信公众号 xff1a WELTest 分享一个常用命令 xff0c 批量杀掉一批进程 xff0c 这里以tomcat为例 xff1a ps ef grep tomcat awk 39 print 2 39 xargs kill 9 命令解
  • 【VUE】renren-fast-vue跳过验证码及使用mock数据单独添加一个页面

    效果图 解决办法 1 使用官方演示系统数据 1 把代理打开设置为True 2 在修改config目录下的index js的target值为 xff1a http demo open renren io renren fast server
  • 【软件测试】以闭环思维解决BUG复现率高问题

    bug复现率 要求复现BUG数 总bug数 背景 软件测试中提Bug 作为每个测试人员都应该遇到过 那每个测试人员可能也会遇到不停帮开发复现Bug的问题 如果Bug复现对环境要求不高 那复现成本还是比较低的 那如果环境复杂 那复现成本还是比
  • 自动化测试:功能移植之存储过程数据正确性验证

    自动化测试 功能移植之存储过程数据正确性验证 背景说明 系统架构的变更及调整 会引相同功能在不同架构上的移植工作 功能移植工作会产生多种变式 每种变式的测试策略是不一致的 本文主要讨论的变式为 业务不发生变动 只进行代码移植 结果表结构与原
  • docker mysql:5.6镜像安装mysqlreport、pt-query-digest

    更新debian源 echo 34 deb http ftp cn debian org debian stretch main 34 gt etc apt sources list echo 34 deb http ftp cn debi
  • 性能测试:模型趋势预测,让生产性能预测

    随着系统复杂度的提升 系统架构复杂度 部署规模也在逐步提升 这对性能测试测试 分析都带来挑战 古语有云 兵马未动粮草先行 针对测试而言测试环境及数据就是 粮草 性能测试如果环境 数据差异较大 性能测试出来的结果对生产指导意义就不是很大 那如
  • 【python黑帽子2】netcat.py编写及使用说明

    环境信息 python3 9 12 IDE为 xff1a vscode 源码 书中源码注意点 xff1a send函数中的if recv len lt 4096需要调整为if recv len lt 2 xff1a 该出的recv len值
  • 【Python黑帽子】proxy.py脚本

    span class token comment coding 61 utf 8 span span class token keyword import span sys span class token keyword import s
  • 【Jmeter】跨线程组共享数据

    背景 在性能测试中 xff0c 经常会遇见使用多线程组的情况 xff0c 例如用户登陆成功后 xff0c 对某个查询接口使用500个线程来进行压测 xff0c 这个时候就需要使用多线程组 设计说明 首先 xff0c 需要使用setUp Th
  • 【playwright】使用pytest-playwright执行用例时频繁打开浏览器

    背景说明 安装pytest playwright之后 xff0c 执行多个用例频繁打开浏览器 xff0c 而且无法给对应的fixture的scope设置为session 原因说明 pytest playwright定义了fixture的sc
  • (转)注册JNI函数的两种方式

    原文地址 http blog csdn net wwj 748 article details 52347341 前言 前面介绍过如何实现在Android Studio中制作我们自己的so库 xff0c 相信大家看过之后基本清楚如何在And
  • 【playwright】使用playwright实现拖动功能

    思路说明 使用locator定位到要拖动滑块元素 xff0c 如元素名叫ele 获取元素ele的bounding box含4分属性值 xff1a x xff0c y xff0c width xff0c height 把鼠标移动到元素ele的
  • 【playwright】pytest-playwright与allure结合,生成报告带有图片和录屏

    依赖的环境 需要安装allure命令行工具以及allure pytest插件 pytest playwright需要升级0 3 0版本 xff0c 改版本支持如下参数 xff1a Playwright browser 61 chromium

随机推荐

  • 【性能测试】缓慢的磁盘问题分析套路

    该文基于 性能之巅 xff1a 洞悉系统 企业与云计算 的1 9 1 缓慢的磁盘章节调整而来 用户问题 Scott 是一家中型公司里的系统管理员 数据库团队报告了一个支持ticket xff08 工单 xff09 xff0c 抱怨他们有一台
  • 【虚拟机】win 10的virtual box打开虚拟机报VERR_MEM_INIT_FAILED

    错误信息 解决办法 进入到 控制面板 程序 程序和功能 xff1a 选择 启用或关闭 Windows 功能 xff1a 重启电脑 xff0c 重新打开virtual下的虚拟机 xff0c 能够正常启动 xff1a
  • 【playwright】pytest-playwright增加代理服务选项

    playwright的代理设置参数为 xff1a https playwright dev python docs network http proxy 对pytest playwright py进行如下调整 xff0c 在browser
  • 【镜像源】分享三个镜像链接

    兰州大学 xff1a https mirror lzu edu cn 南京大学 xff1a https mirror nju edu cn docker官方镜像库 xff1a https github com docker library
  • 【Docker】基于系统iso构建docker基础镜像

    1 搭建本地yum源 1 xff09 将镜像通过光盘或U盘挂载到 mnt目录下 mount media kylin xxx iso mnt kylin 2 xff09 修改 etc yum repo d kylin x86 64 local
  • 【数据库】Oracle 12透明网关查询postgresql表某些字段不展示问题处理

    前置条件 1 对应版本列表 服务 版本 Oracle 12C 12 2 0 1 0 Heterogeneous Agent 12 2 0 1 0 odbc 2 3 1 unixODBC 2 3 6 psqlodbc 9 2 24 查看命令
  • 【机器学习】lightGBM是什么?

    梯度提升法 Gradient Boosting Machine 简记 GBM 以非参数方法 不假设函数形式 估计基函数 并在 函数空间 使用 梯度下降 进行近似求解 非参数方法包括K近邻法 决策树 以及基于决策树的装袋法 随机森林与提升法等
  • 【HttpRunner】学习准备

    1 安装python 3 7及以上版本 xff1a 2 安装fastapi xff1a pip install fastapi all 3 把如下代码粘贴复制到main py文件中 xff1a span class token keywor
  • Android中锁定文件的方法

    androidSDK中并没有锁定文件相关的api 但是android是基于linux操作系统的 linux比较底层 灵活性也更大 为了实现锁定文件的效果 大概有以下几种办法 用chmod命令修改文件读写权限利用linux中的多线程独占锁 启
  • 远程控制Ubuntu

    远程控制Ubuntu 在Ubuntu上安装team viewer或者向日葵 xff0c 进行远程控制 xff0c 这里记录采用team viewer方式的配置过程 xff0c 向日葵等远程控制类似 安装Ubuntu 官方下载Ubuntu系统
  • 信号降噪方法

    傅里叶变换 只能获取一段信号总体上包含哪些频率的成分 xff0c 但是对各成分出现的时刻并无所知 对非平稳过程 xff0c 傅里叶变换有局限性 短时傅里叶变换 xff08 Short time Fourier Transform STFT
  • C++ 带通滤波

    Butterworth Filter Coefficients The following files are for a library of functions to calculate Butterworth filter coeff
  • python之collections

    collections是日常工作中的重点 高频模块 xff0c 包含了一些特殊的容器 xff0c 针对Python内置的容器 xff0c 例如list dict set和tuple xff0c 常用类型有 xff1a namedtuple
  • git 指定下载文件,目录

    1 创建路径 mkdir gitfile cd lt 路径 gt eg xff1a cd home gitfile 2 创建一个空的本地仓库 git init 3 连接远程仓库GitHub git remote add f origin l
  • Ubuntu v4l2 视屏流花屏问题

    之前用的好好解析YUV xff0c MJPEG 换了个核心板就不好使了 xff0c opencv3 4 6 gt gt gt opencv4 5 5 xff0c Mat xff0c cvMat xff0c IplImage 的类型转换也不好
  • qt qmake .qrc hasmodification time xxx in the future

    原因 xff1a 跨平台生成的 qrc 文件创建时间与目标平台时间不一致导致 xff0c 如win写的 copy 到 Linux xff0c 再编译可能会遇到该bug 导致无法qmake 与 build 解决 xff1a touch qrc
  • (转)python图像操作

    转自 xff1a zbxzc 侵删 使用PIL完成 python view plain copy span class hljs keyword import span Image span class hljs comment 打开图像
  • 关于input to reshape is a tensor 的问题

    span class hljs keyword for span index name span class hljs operator in span enumerate classes class path 61 cwd 43 name
  • mobileNet训练自己的样本

    span class hljs keyword import span matplotlib pyplot span class hljs keyword as span plt span class hljs keyword import
  • 关于屏幕适配之比例布局

    对于平板等需求场合 xff0c 它们的屏幕比例以16 xff1a 10和16 xff1a 9等为主 xff0c 但是屏幕尺寸各异 xff0c 分辨率各异 xff0c 即便是同一尺寸也有多种分辨率 xff0c 这种时候无论是使用dp还是px