扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
@[TOC](文章目录)
珠晖网站建设公司成都创新互联公司,珠晖网站设计制作,有大型网站制作公司丰富经验。已为珠晖上千提供企业网站建设服务。企业网站搭建\外贸网站建设要多少钱,请找那个售后服务好的珠晖做网站的公司定做!
hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1"
# 前言
font color=#999AAA 使用工具Android studio,利用values文件下dimens.xml界面适配安卓屏幕/font
hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1"
font color=#999AAA 提示:以下是本篇文章正文内容,下面案例可供参考
# 一、概念
1.屏幕分辨率单位是px,例如Android手机常见的分辨率:320x480px、480x800px、720x1280px、1080x1920px。
2.手机屏幕的密度:每英寸的像素点数,单位是dpi。
| 密度类型 |代表的分辨率(px)| 屏幕像素密度(dpi) | 1dp转换为px |
|:--------|:--------|:--------|:--------|
| 低密度(ldpi) |240x320|120|0.75|
| 中密度(mdpi) |320x480|160|1|
| 高密度(hdpi)|480x800|240| 1.5|
| 超高密度(xhdpi)|720x1280|320|2|
| 超超高密度(xxhdpi) |1080x1920|480|3|
3.由于android的机型屏幕大小品类太多了,有一些是不标准的,这时我们就需要单独去获取屏幕的分辨率和密度了。
# 二、获取屏幕的分辨率和密度
```java
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
float density = displayMetrics.density;
int densityDpi = displayMetrics.densityDpi;
int width = displayMetrics.widthPixels;
int height = displayMetrics.heightPixels;
Log.e("123","密度:"+density+"---"+densityDpi);
Log.e("123","屏幕分辨率:"+width+"x"+height);
Log.e("123","安卓系统:"+android.os.Build.VERSION.RELEASE);
Log.e("123","手表型号:"+android.os.Build.PRODUCT);
```
# 三、SmallestWidth适配
**smallestWidth适配,或者叫sw限定符适配。指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。**
**sw计算公式:sw = 屏幕宽度 / (dpi/160) 注:160是默认的**
**例如:屏幕宽度为1080px、480dpi 的sw = 1080/(480/160)**
# 四、生成 dimens 文件
1、 首先在 res 目录下新建各种尺寸的 values 文件 。文件名为:values-sw(你要适配屏幕的sw值)dp。
例如:
![code23]()
注意:values文件下也生成 dimens文件
**生成dimens值工具类**
1、先生成标准的值。//value = (i + 1) * 1;
2、再用生成其他的值。 //value = (i + 1) * 需要生成的sw值/标准的sw值;
例如:value = (i + 1) * 160 / 320;
```java
public static void genDimen() {
StringBuilder stringBuilder = new StringBuilder();
try {
double value;
for (int i = 0; i 500; i++) {
//value = (i + 1) * 1; //这里控制对应转换的值,如果是标准尺寸就一对一转换
//value = (i + 1) * 需要生成的sw值/标准的sw值; //这里控制对应转换的值
value = (i + 1) * 1
//value = (i + 1) * 160 / 320;
value = Math.round(value * 100) / 100;
//dp可改成sp
stringBuilder.append("dimen name=\"size_" + (i + 1) + "\"" + value + "dp/dimen\r\n");
}
if (stringBuilder.length() 4000) {
for (int i = 0; i stringBuilder.length(); i += 4000) {
if (i + 4000 stringBuilder.length())
Log.e("123", stringBuilder.substring(i, i + 4000));
else
Log.e("123", stringBuilder.substring(i, stringBuilder.length()));
}
} else {
Log.e("123", stringBuilder.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
```
示例:(我这是以sw320为适配的标准的,你们可改自己的标准)
1、sw320的样例
```java
resources
dimen name="dimen_1"1.0dp/dimen
dimen name="dimen_2"2.0dp/dimen
dimen name="dimen_3"3.0dp/dimen
dimen name="dimen_4"4.0dp/dimen
dimen name="dimen_5"5.0dp/dimen
dimen name="dimen_6"6.0dp/dimen
dimen name="dimen_7"7.0dp/dimen
dimen name="dimen_8"8.0dp/dimen
dimen name="dimen_9"9.0dp/dimen
dimen name="dimen_10"10.0dp/dimen
dimen name="size_1"1.0sp/dimen
dimen name="size_2"2.0sp/dimen
dimen name="size_3"3.0sp/dimen
dimen name="size_4"4.0sp/dimen
dimen name="size_5"5.0sp/dimen
dimen name="size_6"6.0sp/dimen
dimen name="size_7"7.0sp/dimen
dimen name="size_8"8.0sp/dimen
dimen name="size_9"9.0sp/dimen
dimen name="size_10"10.0sp/dimen
/resources
```
2、sw160的样例
```java
resources
dimen name="dimen_1"0.0dp/dimen
dimen name="dimen_2"1.0dp/dimen
dimen name="dimen_3"1.0dp/dimen
dimen name="dimen_4"2.0dp/dimen
dimen name="dimen_5"2.0dp/dimen
dimen name="dimen_6"3.0dp/dimen
dimen name="dimen_7"3.0dp/dimen
dimen name="dimen_8"4.0dp/dimen
dimen name="dimen_9"4.0dp/dimen
dimen name="dimen_10"5.0dp/dimen
dimen name="size_1"0.0sp/dimen
dimen name="size_2"1.0sp/dimen
dimen name="size_3"1.0sp/dimen
dimen name="size_4"2.0sp/dimen
dimen name="size_5"2.0sp/dimen
dimen name="size_6"3.0sp/dimen
dimen name="size_7"3.0sp/dimen
dimen name="size_8"4.0sp/dimen
dimen name="size_9"4.0sp/dimen
dimen name="size_10"5.0sp/dimen
/resources
```
3、xml界面控件使用样例
```java
TextView
android:layout_width="@dimen/dimen_30"
android:layout_height="@dimen/dimen_30"
android:textSize="@dimen/size_20"
android:layout_margin="@dimen/dimen_10"
android:padding="@dimen/dimen_10"
```
hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1"
# 总结
font color=#999999 提示:这里对文章进行总结:
如果你的app需要适配dpi较低的屏幕,最好以最小dpi的sw为适配的标准。
在进行应用开发和展示的时候,经常需要将Android手机投影到PC屏幕或者投影仪上。豌豆荚或者91手机助手虽然能够通过USB将手机屏幕投影至PC,但是在手机上切换屏幕时,PC上相应的影像切换速度太慢,不能满足展示要求。借助于droidVN这款软件和随身WiFi能够更快速地将手机屏幕投影至PC,进而投影至投影仪上。
同时droidVNC还是一款远程控制的软件,在PC上安装droidVNC客户端,除了可以将手机屏幕投影至PC上,还能对手机进行远程控制。具体步骤如下
方法/步骤
1下载并安装droidVNC
2下载并安装VNC Viewer
3在PC上安装VNC viewer,VNC viewer的'软件有许多,其中realVNC,TightVNC是比较见得比较多的两种。Tight VNC是免费的,可以从g网获得和安装,因此这里使用Tight VNC进行连接。
4安装小度WiFi
5第一次使用小度WiFi,则需要在从g网下载并安装驱动;第二次使用的话,插入小度WiFi后,直接点击桌面图标打开小度WiFi软件,小度WiFi自动创建热点WiFi热点。
6手机关联小度WiFi创建热点
7启动手机上droidVNC软件
8在开始栏中输入tightvnc搜索出tight VNC viewer并打开
9在tight VNC viewer界面输入地址和端口信息,中间用两个冒号隔开。如果没有做特殊设置,直接输入192.168.123.11::5901
10在tight VNC中保存连接为vnc文件,放到桌面上。以方便下一次使用
1、打开安卓手机的应用商店,输入鲁大师,在查询的结果中点击安装。
2、打开手机桌面上的鲁大师软件。
3、进入鲁大师软件以后点击右下角的工具箱按钮。
4、在出现的界面中找到屏幕检测,点击打开。
5、在出现的界面中点击坏点检测。
6、页面跳转后点击开始检测。
7、点击开始检测之后,手机屏幕会呈现蓝色,点击屏幕。
8、屏幕的颜色会开始变换,仔细查看屏幕上的颜色是否存在坏点。
9、继续点击屏幕依次出现红色、灰色、白色和黑色按钮,颜色变换中可以查看屏幕是否有坏点。
10、最终点击屏幕结束坏点检测,即完成了安卓手机的屏幕坏点检测。
5 年前,苹果的「全面屏」手机 iPhone X 正式问世。
iPhone X 与小米 MIX2.
它既为此前延续四代 iPhone 的外观划上了句号,也开启了 iPhone 新一轮不变的设计风格。
不论是圆滑过渡,还是直角边。不论是 OLED 材质,还是 LCD 材质。以 iPhone X 为起点的话,后续的 iPhone 几乎都遵循了一个坚持,即是「四边等宽」。
iPhone 12 与 iPhone 13.
同样在 5 年前,Android 手机同样在 探索 「全面屏」,它们不像直接亮出答案的 iPhone,反而给出了很多的答案,其中也包括屏幕的黑边。
俗话说,钱能解决的都不是问题。四边等宽的「关键」之一便是先进的 COP 封装,成为了 Android 厂商们追求的技术。
华为 P50 Pro.
不过,随着屏幕 COP 封装成为主流选择,但依然很少见与 iPhone 类似的「四边等宽」设计。
反而,Android 手握 COP 封装开始追逐曲面屏、极窄边框,进而打出差异化与视觉冲击力上来。
三星 Galaxy S22 与 Galaxy S22+.
一直到三星 Galaxy S22 系列的出现,准确的说是 Galaxy S22 和 S22 Plus 这两台真 S 序列。
延续 Galaxy S 系列设计风格的同时,还用上了「四边等宽」的屏幕,甚至要比现在 iPhone 13 系列的边框还要窄上一圈,称之为「四边等窄」。
四边等窄与非曲面屏的设计,反而让 Galaxy S22 系列在 Android 阵营里有了足够的冲击力和差异性。
似乎,四边等宽、曲面屏这些形态无法等同于冲击力、差异性。如此来说,Galaxy S22 的出现是否会让 Android 厂商们把四边等宽引入到各自产品的设计之中?
在分析 Android 厂商们之前,我们还是回到 iPhone 上来,毕竟它们是四边等宽设计的忠实拥趸。
四边等宽的 iPad mini 6.
从 iPhone X 开始,到现在的 iPhone 13 系列,甚至到 iPad、MacBook Pro、Apple Watch,都有四边等宽元素的体现。
科技 博主 John Gruber 在《设计即品牌(design as branding)》的一篇博客中,极力推崇了苹果的「制定一个目标,并坚定地朝着这个方向精进」这种设计哲学。
iPhone 的过去十年,与未来十年.
值得注意的是,这篇关于苹果设计的播客有两个背景,一是发布于 iPhone X 之前 ,二实则是 Gruber 反驳纽约时报的《苹果失去尖端设计》的专栏。
彼时来看,iPhone 7 系列的亮黑色已经是金属后盖的工艺顶峰,并非停滞不前,失去了尖端设计。
iPhone 7 亮黑色.
到了引领 iPhone 进入下一个形态稳定期的 iPhone X,与 iPhone 4、iPhone 6 类似,它们都预示着不同时期 iPhone 的终极形态。
正面全是屏幕,毫无遮挡,只剩下边框,便是苹果认为在全面屏时代下 iPhone 该有样子。
传闻中的 iPhone 14 Pro,距离真全面屏又近了一小步.
而在 iPhone X,甚至到现在的 iPhone 13 系列中,苹果仅完成了四边等宽,如今它们正在跟刘海(FaceID)较劲,已经有了一些成果。
同样地,四边等宽(加刘海)的形态也延续到后续的 Apple Watch、iPad Pro、iPad mini、MacBook Pro 等一系列苹果产品上。
Design as branding,设计是为品牌服务,而非单一的产品。好的品牌设计,就像保龄球一样笔直向前。不好的品牌设计,就好像钟摆一般来回摇摆。
相对于所谓的「秩序感」,屏幕四边等宽的设计信条实际更接近与为品牌服务,也可以说是一种「家族化」设计。
严格追求「四等宽」设计,为 iPhone 带来的就是一种品牌认知度,以及抛开 Logo 的一种品牌辨识度。(甚至你也可以说刘海也是如此。)
大概分为两个时期,一个是工艺成本决定,另一个则是对产品线的考虑。
iPhone X 的发布大概突出了三件事,一是过万的售价,二是 Face ID 结构光生物解锁,三是 COP 先进的封装工艺(在消费层面则是四等边、窄下巴)。
当时 iPhone X 上的这块异形屏成本大概在 80 美元左右,而同代的 iPhone 8 Plus 的屏幕成本只有 50 美元。
屏幕成本,以及为此而设计的边框,内部结构等等硬件成本也不断攀升,让 iPhone X 敲开了 iPhone 的万元时代。
与此同时,随着异形屏幕成为主流,Android 厂商也逐步入局,但面对定制屏幕和 COP 封装工艺的双高成本,它们只能取其一,也出现了「下巴」问题。
倘若以「下巴」为基准,再去做四等边的话,设计师可能会提刀去见产品开发。此时,「非四等边」的设计风格便成为大家心照不宣的一个选择。
并且,为了极具冲击力的视觉,双曲面屏、瀑布屏等设计,也渐渐成为一个选择。
随着 COP 封装的成熟,异形屏幕成本的降低,全面屏的 iPhone 也逐步下放至入门机型,Android 阵营们仍然不肯拿出「四等边」的设计,反而更愿意去做曲面屏了。
其实,这里还有一个节点,那就是 5G 网络。
在拥抱超速的 5G 网络之时,也为终端设备带来了一些烦恼,发热和续航,需要更大的机身来中和,双曲面屏幕、弧形机身恰好是一个解决方案,更加坚定了「曲面屏」的选择。
另外,如同 iPhone,很多设计风格会在一年两年之后下放到中端设备。Android 们也会在旗舰产品上布局新技术、设计和规格,几次更迭之后逐步下放到中端产品里。
苹果的中端、入门设备可能会在 4000 或者 5000 价位,而 Android 可能涵盖 1000 到 3000 的价位段,相对来说,Android 所覆盖到的人群更看重规格配置,而非四等宽、COP 封装带来的隐形成本上。
为了厚度、手感,视觉、设计风格,以及产品线的综合考量,各路权衡下来,致使 Android 阵营里很少出现四等边的产品出现。
对于「四等边」的呼吁,其实也是在 iPhone X 发布之后,和 Android 阵营五花八门的「刘海」模仿,有点东施效颦,刘海学来了,但四等边的美感却不在。
彼时,很多 Android 产品对全面屏的设计还处于「 探索 阶段」,整体的设计风格就好像钟摆一般,让人捉摸不定。
这个时候,学习 iPhone 的设计风格和设计元素是许多 Android 厂商的做法。
随着屏幕封装工艺的成熟,许多厂商在这个过程里也开始重新思考能代表品牌的设计,以及如何让设计元素来成为品牌的名片。
就好像四等宽之于 iPhone,Face ID 之于 iPhone,诞生出,晶钻工艺之于 OPPO,火山口之于 Find,云阶之于 vivo,星环设计之于华为。
硬件上,Android 们也打出了与 iPhone 不同的牌,高功率充电,更大的电池,更多的摄像头等等。
倘若说,iPhone X 时期的 Android 向 iPhone 看齐的话,那之后的 Android 已经彻底与 iPhone 分道扬镳。
即使现在屏幕的技术、工艺和成本,做出四等边的难度大幅降低,Android 厂商们也碍于产品层面的考量而并未跟进,反而依然去按照自己的节奏设计和诠释产品。
设计为品牌服务,而不是为了「炫技」或者说跟随,很多 Android 厂商也在逐步地发现自己的传承风格,至于用不用「四等边」还是用不用直屏可能并不是重点了。
Android屏幕适配-基础篇
Android屏幕适配-应用篇
从两个大方面阐述一下Android的屏幕适配:
Android推荐使用dp作为尺寸单位来适配UI ,通过dp加上自适应布局和weight比例布局可以基本解决不同手机上适配的问题,这基本是最原始的Android适配方案。
缺点 :
(1)这种方案只能保证我们写出来的界面适配绝大部分手机,部分手机仍然需要单独适配,但dpi的不同,还是会存在差异。
(2)一般的设计稿都是以px为单位的,所以我们在写layout文件的时候需要将px转为dp,影响开发效率。
为了高效的实现UI开发,出现了新的适配方案,我把它称作宽高限定符适配。简单说,就是穷举市面上所有的Android手机的宽高像素值,设定一个基准的分辨率,其他分辨率都根据这个基准分辨率来计算,在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件:
鸿洋大神的作品 ,使用也超级简单,核心功能就是在绘制的时候在onMeasure里面做变换,重新计算px。
缺点 :我们自定义的控件可能会被影响或限制,可能有些特定的控件(框架没有做适配的控件),需要单独适配。
小结:上述几种适配方案都是实际开发中用过的方案,但随着技术不断的更新,出现了更好的适配方案。
实现原理 :Android会识别屏幕可用高度和宽度的最小尺寸的dp值( 其实就是手机的宽度值 ),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。
sw限定符适配 和 宽高限定符适配 类似,区别在于,前者有很好的容错机制,如果没有value-sw360dp文件夹,系统会向下寻找,比如离360dp最近的只有value-sw350dp,那么Android就会选择value-sw350dp文件夹下面的资源文件。这个特性就完美的解决了上文提到的宽高限定符的容错问题。
优点: 1.非常稳定,极低概率出现意外
2.不会有任何性能的损耗
3.适配范围可自由控制,不会影响其他三方库
缺点 :就是多个dimens文件可能导致apk变大,几百k。
附件: 生成sw文件的工具
实现原理 : 修改系统的density值 (核心)
今日头条适配是以设计图的宽或高进行适配的,适配最终是改变系统density实现的。
过程:
AndroidAutoSize 是基于今日头条适配方案,该开源库已经很大程度上解决了今日头条适配方案的两个缺点,可以对activity,fragment进行取消适配。也是目前我的项目中所使用的适配方案。
使用也非常简单只需两步:
(1)引入:
(2)在 AndroidManifest 中填写全局设计图尺寸 (单位 dp),如果使用副单位,则可以直接填写像素尺寸,不需要再将像素转化为 dp,详情请查看 demo-subunits
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流