❶ android 屏幕适配
1: dp: android 尺寸的基本单位。 在不同的分辨率的手机里面,1dp对应着不同数量的px, 这样就实现了dp定义一个控件大小的时候,在不同分辨率手机里表现出相应大小的像素值。
2: 屏幕分辨率: 1080下160, 表示宽度有1080个像素点而高度有2160个像素点。常见的分辨率有320x480, 480x800, 720x1280, 1080x1920等。
3: 屏幕尺寸: 以寸为单位, Android设备对角线的长度
4: 像素密度: 每英寸的像素点
5: 屏幕尺寸, 分辨率,像素密度 三者之间的关系:
密度(dpi)= √(宽2 + 高2)/屏幕尺寸
6: px:像素,是屏幕上显示数据的最基本的点
7: dpi:屏幕像素密度,每英寸上的像素点数
8: sp:与dp类似,通常用于指定字体的大小,当用户修改手机显示的字体时,字体大小会随之改变。
1: dp适配方案: Android自带的原始的适配方案, 在不同的分辨率手机里面表现出相应大小的像素点。
缺点: Android的碎片化严重, 如果生产厂家没有根据屏幕尺寸、分辨率和像素密度的关系来规则定义, 或者出一些乱七八糟的屏幕大小,这样的适配方案就不在适合了。
2: 宽高限定符:枚举所有的屏幕宽高像素值,根据等比缩放去适配。如果没有找到对应的屏幕, 则取默认的。 目前这种方案已经被弃用。
缺点:
1: 占用资源大,会增加APK的体积。
2: 容错机制大需要精准命中资源文件才能适配,比如1920x1080的手机就一定要找到1920x1080的限定符,否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话,UI就很可能变形。
3:AndroidAutoLayout适配方案(停止维护)
4: SW限定符适配方案:(smallestWidth最小宽度适配)
Android 会去识别屏幕可用高度或者宽度的最小尺寸的dp值。然后根据识别到的结果去对应的资源文件里面去找寻相应的结果。
如何生成:ScreenMatch插件
此方案跟宽高限定的适配方案相比,有很好的容错机制, 如果没有找到对应的适配宽度, 那么会在vlues文件里面去找跟他最接近的宽度。
5:今日头条适配方案:
1>: px 转 dp 的公式 dp = px / density.不管我们设定的单位是什么, 最终我们都会将这些单位长度转化为px的。density就是他们的转化比, 所以,动态改变这个转化比也是可以达到我们适配屏幕的目的的。
2>: 通过修改density值,强行把所有不同尺寸分辨率的手机的宽度dp值改成一个统一的值(在清单文件中定义),这样就解决了所有的适配问题。
3>: Density = 当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) ;
4>:引入了AndroidAutoSize屏幕适配框架:
https://github.com/JessYanCoding/AndroidAutoSize
最后, 最重要的................
点赞 点赞 点赞, 不重要的事情也就说3遍......
❷ 怎样获取Android手机屏幕的大小(分辨率、密度)
下面的代码即可获取屏幕的尺寸: 在一个Activity的onCreate方法中,编写以下代码: DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metric); int width = metric.widthPixels; // 宽度(PX) int height = metric.heightPixels; // 高度(PX) float density = metric.density; // 密度(0.75 / 1.0 / 1.5) int densityDpi = metric.densityDpi; // 密度DPI(120 / 160 / 240) 需要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。 所以,需要在工程的AndroidManifest.xml文件中,加入supports-screens节点,如下: 这样当前的Android程序就支持了多种分辨率,那么就可以得到正确的物理尺寸了。
❸ Android开发 怎样获取屏幕的宽高是多少厘米
我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸
下面的代码即可获取屏幕的尺寸。
在一个Activity的onCreate方法中,写入如下代码:
[java] view plain print?
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
但是,需要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。比如说,一部240x320像素的低密度手机,如果运行上述代码,获取到的屏幕尺寸是320x427。因此,研究之后发现,若没有设定多分辨率支持的话,Android系统会将240x320的低密度(120)尺寸转换为中等密度(160)对应的尺寸,这样的话就大大影响了程序的编码。所以,需要在工程的AndroidManifest.xml文件中,加入supports-screens节点,具体的内容如下:
[html] view plain print?
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" />
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" /> 这样的话,当前的Android程序就支持了多种分辨率,那么就可以得到正确的物理尺寸了。
[java] view plain print?
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.TextView;
public class TextCanvasActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(new MyView(this));
//定义DisplayMetrics 对象
setContentView(R.layout.main);
DisplayMetrics dm = new DisplayMetrics();
//取得窗口属性
getWindowManager().getDefaultDisplay().getMetrics(dm);
//窗口的宽度
int screenWidth = dm.widthPixels;
//窗口高度
int screenHeight = dm.heightPixels;
TextView textView = (TextView)findViewById(R.id.tv1);
textView.setText("屏幕宽度: " + screenWidth + "\n屏幕高度: " + screenHeight);
}
}
❹ android 屏幕适配
@[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](https://img-blog.csdnimg.cn/2020111311092374.PNG#pic_center)
注意: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手机型号和屏幕尺寸大小(请标注一下手机是否触屏,最好写一下操作系统版本号)
android手塌信裤机基本全为触屏手机
HTC系列目前主流:
G10 4.3寸SLCD大屏,480*800分辨率,1G 单核CPU,1.5GB ROM+768MB RAM,后置800万像素摄像头,无前置摄像头,电池也只有1230MA,自带android 2.2
G11 4.0寸SLCD屏,480*800高分辨率,1G单核 CPU,1.1G ROM+768M RAM,摄像头800万+130万,1450MA电池,自带android 2.2
G12 3.7寸SLCD屏,480*800高分辨率,1G单核 CPU,1.1G ROM+768M RAM,后置500万像素+前置30万像素摄像头,支持720P高清视坦饥频拍摄,1450MA电池,自带android 2.3
G13 3.2寸TFT屏,320*480分辨率,600M单核CPU,512M ROM+512M RAM,后置500万单摄像头,1230MA电池,自带android 2.3
G14 4.3寸SLCD大屏,540*960高分辨率,1.2G 双核CPU,1GB ROM+768MB RAM,后置800万+前置30万像素摄团简像头,最大支持3264×2448像素照片拍摄,支持1080P高清视频拍摄,电池1530MA,自带android 2.3
G18为G14的升级版,电池1700MA,其他配置一样,带betas魔音效果,自带android 2.3
G15 3.4寸TFT屏,320*480分辨率,800M单核CPU,512M ROM+512M RAM,后置500万+前置30万单摄像头,1450MA电池,自带android 2.3
另外还有,MOTO ME525 DEFY,三防手机,3.7寸TFT屏,480*854分辨率,800M单核CPU,2G ROM+512M RAM,后置500万单摄像头,1500MA电池,自带android 2.2
还有ME525+ DEFY+,CPU升级为 1G,电池1650MA,其他配置一样,自带android 2.3
系统通过ROOT以后都是可以刷机随意升降级的
欢迎采纳!
❻ Android 关于"尺寸"的那些事(dp,dip,sp,pt,px...)
屏幕大小:屏幕大小是手机对角线的物理尺寸,以英寸inch为单位。比如我的Mix 2手机屏幕大小为5.99 inches,意味着我的屏幕对角线长度为5.99inches = 5.99 * 2.54 = 15.2146cm
分辨率:屏幕的像素点数,一般表示为a*b。例如某手机分辨率为21601080,意味着手机屏幕的竖直方向(长)有2160个像素点,水平方向(宽)有1080个像素点。
px :Pixels ,像素;对应屏幕上的实际像素,是画面中最小的点(单位色块),像素大小没有固定长度值,不同设备上1个单位像素色块大小不同。
这么说可能有点陌生,用屏幕分辨率来说,今年流行起来的“全面屏”分辨率是 2160*1080,但是你也可以发现,虽然很多全面屏手机分辨率一样,但是明显看得出来屏幕大小不一样,这也解释了“不同设备像素色块大小是不同的”。
pt :1pt=1/72 inch,用于印刷业,非常简单易用;
dpi :Dots Per Inch,每英寸点数;详见ppi
ppi :Pixels Per Inch,每英寸像素数;数值越大显示越细腻。计算式:ppi = 屏幕对角线像素数 / 屏幕对角线长度。
还是举全面屏的例子,分辨率2160*1080,屏幕大小是5.9inches,勾股定理可以得到对角线像素数大约是2415,那么ppi = 2415 / 5.99 = 403.
事实上dpi 和 ppi 一定程度上可以划等号,都表示像素密度,计算方式完全一致,只不过使用场景不一样。dpi中的dots点属于打印或印刷等领域,例如drawable 文件对应的就是dpi,而ppi中的pixel属于屏幕显示等领域
dp/dip : Density-independent Pixels,密度无关像素 - 基于屏幕物理密度的抽象单位。1dp等于 160 dpi 屏幕上的dpx,这是 系统为“中”密度屏幕假设的基线密度。在运行时,系统 根据使用中屏幕的实际密度按需要以透明方式处理 dp 单位的任何缩放 。dp 单位转换为屏幕像素很简单:px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素。在定义应用的 UI 时应始终使用 dp 单位 ,以确保在不同密度的屏幕上正常显示 UI。
如果看完文章还是觉得很懵,那么可以直接记住: 1dp单位在设备屏幕上总是等于1/160 inch。
sp :Scale-independent Pixels ,与 dp 单位相似,也会根据用户的字体大小偏好进行缩放。
首先我们放上源码中对尺寸单位的转换
可以看到,输入值类型为dp时,返回 value * DisplayMetrics.density,到这里我们可能会发懵:嗯?不对啊,前面我们不是通过px 和 dp 的换算公式来计算的么,怎么这里就简简单单乘了一个DisplayMetrics.density?不要慌,我们先看看源码中对DisplayMetrics.density的介绍。
源码注释中说到“在160dpi的屏幕下,density的值为1,而在120dpi的屏幕下,density的值为0.75”,我们可以大胆的猜测一下,120dpi下的density=0.75的原因是120dpi * 1 /160dpi=0.75。实际上,也就是这么回事。我们下面会仔细的分析。
需要补充一下,通常意义上Android 屏幕的密度,指的是像素密度dpi/ppi,对应于源码中的DisplayMetrics.densityDpi。
为什么引入dp?
Android 引入了dp这一单位,使得不论多大屏幕,多大dpi,显示的效果始终保持一致。
但是根据前面我们提到的px与dp的换算公式px = dp * (dpi / 160),很显然,由于相同分辨率但不同屏幕大小的设备dpi是不同的,导致px和dp的基本不存在一个固定的换算关系,为了方便屏幕适配,Android设置了6个通用的密度,换算px与dp时采取通用密度计算,而非设备实际的密度。
以下为6种通用密度,以及其最小的分辨率
得到上面通用密度之后,我们换算dp与px多了一种简便方式。前面我们提到Android将mdpi作为基准,此时1px = 1dp,又有px = dp * (dpi / 160),所以我们可以很容易的得到以下换算:
还记不记得前面源码中的density属性,实际上DisplayMetrics.density = dpi / 160 ,表示的就是在某个通用密度下dp与px的换算比(1dp/1px的值)
这部分其实和程序员自身已经关系不大了,毕竟参与工作之后这些都是UI人员的活儿了。不过鉴于现在我还只是一枚在校生,还是记下来以免自己遗漏吧。
建议在xhdpi中作图
原因嘛,首先现在主流分辨率是1080p,以及最近流行起来的全面屏18:9,而xhdpi对应720p,向低dpi兼容自然没问题,即便在xxhdpi中显示,也会有个不错的效果。而如果以1920*1080作图,显然图片素材占用的内存很大,而且也会增大应用安装包的大小。
只有一个原则:资源放入对应dpi的文件夹中,Android会机智的加载合适的资源。
以drawable资源为例:
我们平时开发小项目&对UI要求不高时,只使用一套xhdpi的资源就足够了,虽然这可能会导致在hdpi及以下的手机中有些卡顿,因为xhdpi的图片运行在hdpi及以下的手机上会比较吃内存,不过无伤大雅。
而如果不为图片资源犯愁时(有UI人员的支持,就是任性),就可以添加所有dpi的资源。当然,重点还是要满足ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12的规律。
好像说了不少废话,哈哈,大概就这么多吧。