android中实现设备尺寸适配

1、引言

        设备尺寸适配的重要性想必就不用我多说了,在我发布的历史文章中我曾谈过Qt中的设备尺寸适配问题,那这里我就来教大家如何在android中做设备尺寸适配。在android中设备尺寸适配的方式有好几种,但我喜欢的还是使用获取设备真实尺寸然后按照百分比重新设置控件大小的方式,因此接下来我就只演示这一种方法。

2、准备工作

2.1、生成接口类

        首先需要生成一个接口类,便于区分不同的操作,使用时需要让activity或者fragment继承该接口,具体代码如下:

package xyz.dritrtj.uisize;public interface Init {/*** 初始化视图控件,并设置监听*/public abstract void initView();/*** 设置控件尺寸属性*/public abstract void setViewSize();/*** 设置数据*/public abstract void setData();
}

2.2、生成UI尺寸工具类

        工具类代码如下,下面会对工具类使用进行讲解:

package xyz.dritrtj.uisize;import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.util.TypedValue;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;/*** 用于适配UI控件尺寸*/
public class SetUiSize {public static float displayWidth;//屏幕宽度 单位像素public static float displayHeight;//屏幕高度 单位像素public static float statusHeight;//状态栏高度 单位像素,暂时没有获取public static float displayWidthDp = 411;//屏幕默认宽度 单位dppublic static float displayHeightDp = 731;//屏幕默认高度 单位dp/*** 设置背景* @param v*/public static void setBackground(View v){GradientDrawable drawable= (GradientDrawable) v.getBackground();int size= (int) (10/SetUiSize.displayWidthDp*SetUiSize.displayWidth);//两个参数表示一个角,按照左上角,右上角,右下角,左下角的顺序用两个相同的数据表示drawable.setCornerRadii(new float[]{size,size,size,size,size,size,size,size});size= (int) (0.38f/SetUiSize.displayWidthDp*SetUiSize.displayWidth);if (size==0){//避免因为数值转化变为零size=1;}drawable.setStroke(size, Color.parseColor("#c5c5c5"));}/*** 设置圆角* @param v* @param radius*/public static void setRadius(View v,int radius){GradientDrawable drawable= (GradientDrawable) v.getBackground();int size= (int) (radius/SetUiSize.displayWidthDp*SetUiSize.displayWidth);//两个参数表示一个角,按照左上角,右上角,右下角,左下角的顺序用两个相同的数据表示drawable.setCornerRadii(new float[]{size,size,size,size,size,size,size,size});}/*** 设置背景* @param v* @param strokeColor*/public static void setBackground(View v,String strokeColor,String solidColor){GradientDrawable drawable= (GradientDrawable) v.getBackground();int size= (int) (5/SetUiSize.displayWidthDp*SetUiSize.displayWidth);//两个参数表示一个角,按照左上角,右上角,右下角,左下角的顺序用两个相同的数据表示drawable.setCornerRadii(new float[]{size,size,size,size,size,size,size,size});size= (int) (1/SetUiSize.displayWidthDp*SetUiSize.displayWidth);drawable.setStroke(size, Color.parseColor(strokeColor));drawable.setColor(Color.parseColor(solidColor));}/*** 设置背景* @param v* @param strokeColor* @param solidColor* @param width*/public static void setBackground(View v,String strokeColor,String solidColor,int width){GradientDrawable drawable= (GradientDrawable) v.getBackground();int size= (int) (5/SetUiSize.displayWidthDp*SetUiSize.displayWidth);//两个参数表示一个角,按照左上角,右上角,右下角,左下角的顺序用两个相同的数据表示drawable.setCornerRadii(new float[]{size,size,size,size,size,size,size,size});size= (int) (width/SetUiSize.displayWidthDp*SetUiSize.displayWidth);drawable.setStroke(size, Color.parseColor(strokeColor));drawable.setColor(Color.parseColor(solidColor));}/*** 设置圆形的选择按钮* @param v*/public static void setCircle(View v){GradientDrawable drawable= (GradientDrawable) v.getBackground();int size= (int) (16/SetUiSize.displayWidthDp*SetUiSize.displayWidth);drawable.setSize(size,size);size= (int) (4/SetUiSize.displayWidthDp*SetUiSize.displayWidth);drawable.setStroke(size, Color.parseColor("#dedede"));}/*** 设置TextView字体尺寸* @param tv* @param originSize 原始尺寸*/public static void setTextViewSize(TextView tv, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);tv.setTextSize(TypedValue.COMPLEX_UNIT_PX,size);//px
//        tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP,size);//dp
//        tv.setTextSize(TypedValue.COMPLEX_UNIT_SP,size);//sp}/*** 设置Button字体尺寸* @param btn* @param originSize 原始尺寸*/public static void setButtonSize(Button btn, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);btn.setTextSize(TypedValue.COMPLEX_UNIT_PX,size);//px}/*** 设置EditText字体尺寸* @param et* @param originSize 原始尺寸*/public static void setEditTextSize(EditText et, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);et.setTextSize(TypedValue.COMPLEX_UNIT_PX,size);//px}/*** 父控件为RelativeLayout时设置底部边距* @param view* @param originSize*/public static void setMarginBottomRelative(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();layoutParams.bottomMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为LinearLayout时设置底部边距* @param view* @param originSize*/public static void setMarginBottomLinear(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();layoutParams.bottomMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为RelativeLayout时设置顶部边距* @param view* @param originSize*/public static void setMarginTopRelative(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();layoutParams.topMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为LinearLayout时设置顶部边距* @param view* @param originSize*/public static void setMarginTopLinear(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();layoutParams.topMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为RelativeLayout时设置左边距* @param view* @param originSize*/public static void setMarginLeftRelative(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();layoutParams.leftMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为LinearLayout时设置左边距* @param view* @param originSize*/public static void setMarginLeftLinear(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();layoutParams.leftMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为RelativeLayout时设置右边距* @param view* @param originSize*/public static void setMarginRightRelative(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();layoutParams.rightMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为LinearLayout时设置右边距* @param view* @param originSize*/public static void setMarginRightLinear(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();layoutParams.rightMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为RelativeLayout时设置边距* @param view* @param originSize*/public static void setMarginRelative(View view, float originSize){setMarginHorizontalRelative(view,originSize);setMarginVerticalRelative(view,originSize);}/*** 父控件为LinearLayout时设置边距* @param view* @param originSize*/public static void setMarginLinear(View view, float originSize){setMarginHorizontalLinear(view,originSize);setMarginVerticalLinear(view,originSize);}/*** 父控件为RelativeLayout时设置layout_marginHorizontal边距* @param view* @param originSize*/public static void setMarginHorizontalRelative(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();layoutParams.rightMargin=size;layoutParams.leftMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为LinearLayout时设置layout_marginHorizontal边距* @param view* @param originSize*/public static void setMarginHorizontalLinear(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();layoutParams.rightMargin=size;layoutParams.leftMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为RelativeLayout时设置layout_marginVertical边距* @param view* @param originSize*/public static void setMarginVerticalRelative(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();layoutParams.topMargin=size;layoutParams.bottomMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为LinearLayout时设置layout_marginVertical边距* @param view* @param originSize*/public static void setMarginVerticalLinear(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();layoutParams.topMargin=size;layoutParams.bottomMargin=size;view.setLayoutParams(layoutParams);}/*** 父控件为RelativeLayout时设置高度* @param view* @param originSize*/public static void setHeightRelative(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();layoutParams.height=size;view.setLayoutParams(layoutParams);}/*** 父控件为LinearLayout时设置高度* @param view* @param originSize*/public static void setHeightLinear(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();layoutParams.height=size;view.setLayoutParams(layoutParams);}/*** 父控件为RelativeLayout时设置宽度* @param view* @param originSize*/public static void setWidthRelative(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();layoutParams.width=size;view.setLayoutParams(layoutParams);}/*** 父控件为LinearLayout时设置宽度* @param view* @param originSize*/public static void setWidthLinear(View view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();layoutParams.width=size;view.setLayoutParams(layoutParams);}/*** 设置GridView的verticalSpacing*/public static void setVerticalSpacing(GridView view, float originSize){int size= (int) (originSize/displayWidthDp*displayWidth);view.setVerticalSpacing(size);}/*** 设置padding*/public static void setPadding(View view, int left, int top, int right, int bottom){left= (int) (left/displayWidthDp*displayWidth);top= (int) (top/displayWidthDp*displayWidth);right= (int) (right/displayWidthDp*displayWidth);bottom= (int) (bottom/displayWidthDp*displayWidth);view.setPadding(left,top,right,bottom);}
}

3、使用方法

3.1、初始化

        首先需要实现接口类,进行相关初始化操作,这里以activity为例,这里最主要的是在setViewSize方法中获取当前设备尺寸,这个一定要放在第一个活动界面中进行初始化,避免后面重复初始化,获取的设备尺寸以像素为单位,代码如下:

package xyz.dritrtj.uisize;import androidx.appcompat.app.AppCompatActivity;import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Display;
import android.view.View;public class UiSizeActivity extends AppCompatActivity implements Init{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_ui_size);initView();setViewSize();setData();}@Overridepublic void initView() {//初始化状态栏View decorView=getWindow().getDecorView();//获取当前界面的DecorViewint option=View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;//更改文字颜色为深黑色decorView.setSystemUiVisibility(option);//设置系统UI元素的可见性getWindow().setNavigationBarColor(Color.TRANSPARENT);getWindow().setStatusBarColor(Color.parseColor("#ffffff"));//将状态栏背景设置为白色getSupportActionBar().hide();}@Overridepublic void setViewSize() {//获取屏幕宽度Display display= getWindowManager().getDefaultDisplay();Point point=new Point();display.getSize(point);SetUiSize.displayWidth=display.getWidth();SetUiSize.displayHeight=display.getHeight();}@Overridepublic void setData() {}
}

3.2、修改工具类的dp宽度值

        使用前需要把SetUiSize类前面的displayWidthDp值设置为自己的布局文件宽度值,在布局文件中点击下方图片中的Pixel,鼠标悬浮在Phones按钮上,左边悬浮框在打勾的选项就是布局文件dp尺寸,从左往右小的尺寸就是宽,这里只用到宽就行。

3.3、工具类使用

        工具类在使用时要注意,根布局不能设置尺寸,一定要在根布局之下的布局中设置尺寸,根布局设置为自适应或者match_parent,命名要对照对应的设置操作,如下两个方法:setMarginTopRelative和setMarginTopLinear,前面一个是设置当前控件的顶部边距,且父控件为相对布局,后一个类似,只是父控件为线性布局,这里父控件布局会有影响,请使用对应的布局,如果没有的工具方法,请自行添加。除此之外有一点要注意,布局文件中设置字体大小一定要用sp为单位,其它都用dp为单位,否则会计算错误。

4、效果对照演示

4.1、重设尺寸前

4.2、重设尺寸后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/678725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言游戏实战(4):人生重开模拟器

前言: 人生重开模拟器是前段时间非常火的一个小游戏,接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏: 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 (1) 游戏开始的时…

PLC在物联网中位置—承上启下,与上位机下位机的关联。

谈到物联网,就绕不开PLC,本文着重介绍PLC的定义、与单片机的区分,价值、物联网中的位置,以及和上位机、下位机的关联,让友友们对PLC有个全面的认知。 一、什么是PLC PLC是可编程逻辑控制器(Programmable L…

UI自动刷新大法:DataBinding数据绑定

之前我们讲了DataBinding在Activity、Fragment、RecyclerView中的基础使用,而那些常规使用方法里,每当绑定的变量发生数据变化时,都需要ViewDataBinding重新设值才会刷新对应UI。而DataBinding通过内部实现的观察者模式来进行自动刷新UI&…

go消息队列RabbitMQ - 订阅模式-direct

1.发布订阅 在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下: 队列与交换机的绑定,不能…

第 384 场 LeetCode 周赛题解

A 修改矩阵 模拟 class Solution { public:vector<vector<int>> modifiedMatrix(vector<vector<int>> &matrix) {int m matrix.size(), n matrix[0].size();vector<int> mx(n, INT32_MIN);for (int i 0; i < m; i)for (int j 0; j &l…

Java微服务学习Day1

文章目录 认识微服务服务拆分及远程调用服务拆分服务远程调用提供者与消费者 Eureka注册中心介绍构建EurekaServer注册user-serviceorder-service完成服务拉取 Ribbon负载均衡介绍原理策略饥饿加载 Nacos注册中心介绍配置分级存储负载均衡环境隔离nacos注册中心原理 认识微服务…

Python : 使用python实现学生管理系统的功能,详细注释

一、学生管理系统 学生描述&#xff1a;姓名、年龄、成绩 学生管理系统功能&#xff1a;添加学生信息、删除学生信息、根据姓名修改学生信息、根据姓名查询学生信息、显示所有学生信息、退出系统 二、代码说明 1. 将每一个学生的信息放一个元组中&#xff0c;再把元组添加到列表…

单片机基础入门:简单介绍51单片机的工作原理

在电子技术领域&#xff0c;单片机是实现智能化控制不可或缺的关键元件。它们集成了许多功能于一身&#xff0c;成为了各种电子系统的心脏。为了更好地理解单片机如何工作&#xff0c;本文将重点介绍51单片机的基本组成和工作原理。 51单片机是一种广泛使用的微控制器&#xf…

【UE 求职】学了虚幻引擎可以应聘哪些岗位?

目录 1 领域1.1 游戏开发领域1.2 影视和动画制作1.3 建筑和工程可视化1.4 模拟和训练1.5 其他领域 2 如何做好一份简历1. 明确简历目标2. 突出UE5相关技能3. 展示相关项目经验4. 教育背景5. 专业经验6. 软技能7. 证书和奖项8. 定制化和校对 &#x1f64b;‍♂️ 作者&#xff1…

使用PHPStudy搭建本地web网站并实现任意浏览器公网访问

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

springcloud分布式架构网上商城源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

Unity Meta Quest MR 开发(四):使用 Scene API 和 Depth API 实现深度识别和环境遮挡

文章目录 &#x1f4d5;教程说明&#x1f4d5;Scene API 实现遮挡&#x1f4d5;Scene API 实现遮挡的缺点&#x1f4d5;Depth API 实现遮挡⭐导入 Depth API⭐修改环境配置⭐添加 EnvironmentDepthOcclusion 预制体⭐给物体替换遮挡 Shader⭐取消现实手部的遮挡效果 此教程相关…

Peter算法小课堂—背包问题

我们已经学过好久好久的动态规划了&#xff0c;动态规划_Peter Pan was right的博客-CSDN博客 那么&#xff0c;我用一张图片来概括一下背包问题。 大家有可能比较疑惑&#xff0c;优化决策怎么优化呢&#xff1f;答案是&#xff0c;滚动数组&#xff0c;一个神秘而简单的东西…

点云标注工具

目录 3d手势识别 c 3d关键点&#xff0c;Bounding Box Labels Rectangle Labels KITTI 3D Ground Truth Annotator c标注工具 3d手势识别 GitHub - 99xtaewoo/Automated-Hand-3D-pose-annotation-Tool: Automated Hand 3D pose annotation Tool c 3d关键点&#xff0c;Bou…

bcdedit /store 填什么,Windows11的BCD文件在哪里?

Windows11为EFI引导&#xff0c;bcd文件在 EFI分区的 \EFI\Microsoft\Boot\BCD 可以选择挂载EFI分区&#xff0c;或者使用如下方式&#xff0c;该路径可充当盘符使用。 例 bcdedit /store Z:\EFI\Microsoft\Boot\BCD /enum /v

【LeetCode每日一题】二维前缀和基本概念与案例

二维前缀和 根据某个块块 的 左上角坐标&#xff0c;和右下角坐标 求出 块块的累加和。 304. 二维区域和检索 - 矩阵不可变 /*** param {number[][]} matrix*/ var NumMatrix function(matrix) {let row matrix.length;let col matrix[0].length;// 初始化一个二维数组&am…

项目02《游戏-13-开发》Unity3D

基于 项目02《游戏-12-开发》Unity3D &#xff0c; 任务 &#xff1a;宠物系统 及 人物头像血条 首先在主面板MainPanel预制体中新建一个Panel&#xff0c; 命名为PlayerInfo 新建Image&#xff0c;作为头像 新建Slider&#xff0c;作为血条 对Panel组件添加一个水…

PE 特征码定位修改程序清单 uiAccess

requestedExecutionLevel level"asInvoker" uiAccess"false" 可以修改这一行来启用禁用原程序的盾牌图标&#xff0c;似乎作用不大。以前没事写的一个小玩意&#xff0c;记录一下。 等同于这里的设置&#xff1a; 截图 代码如下&#xff1a; #include …

谷粒商城【成神路】-【7】——库存系统

目录 &#x1f9c8;1.仓库维护 &#x1f35f;&#x1f35f;1.1配置网关陆游规则 &#x1f35f;&#x1f35f;1.2修改模糊查询 &#x1f95e;2.仓库库存 &#x1f37f;3.采购需需求 &#x1f35f;&#x1f35f;3.1采购的模糊检索 &#x1f35f;&#x1f35f;3.2合并…

system V——进程间通信

上一篇博客中我介绍了system V进程间通信中的内存共享&#xff0c;但是其中还有两 种通信方式&#xff1a;消息队列、和信号量&#xff0c;接下来我将简单介绍一下&#xff0c;消息队列和 信号量以及操作系统是如何看待system V进程间通信的。1. 消息队列 a. 大致介绍 消息队…