android屏幕适配

android屏幕适配,第1张

android设备碎片化严重,因此在实际开发的时候需要做屏幕适配

适配主要是在以下几个方面:

常见的布局适配主要是以下几点:

a避免写死布局尺寸,使用wrap_content或者martch_parent

b使用权重,比如linearlayout中的weight;

c使用relative的相对位置摆放,比如layout_centerInParent="true"

dConstraintLayout 原理类似于relatvie,相对摆放,但是性能相对于relatvie会好一点

eandroid官方的库Percent-support-lib,该库主要是用的是百分比适配

a 9图适配,这个是使用了9图可以在特别区域拉伸不失真的特性来适配

b 使用多套位图,匹配不同的分辨率,比如在mipmap,mipmap-xhdpi,mipmap-xxhdpi,等文件夹下面放多套分辨率不同的内容相同的

是指同一个业务逻辑,在不同的设备上执行不同的跳转方式,比如在手机上打开一个新的activity,但是在平板上,可以在横屏状态下,右侧增加一个fragment,展示打开的页面。

a分辨率限定符,使用drawable-dpi,drawable-hdpi等

b尺寸限定符

c最小宽度限定符

d屏幕方向限定符

aandroid90开始 有官方的api进行适配

b华为,小米,魅族,vivo,oppo各大room厂商有对应的api进行适配

除了以上这些,还有dimens适配,但是都各有缺点,有的需要多套图,有的需要多套资源文件,dimens适配的dimens文件过多,需要针对不同的屏幕分辨率来生成对应的文件,比较繁琐

以上,实际开发中,做的最多的适配为布局适配

开发中屏幕适配的核心是在于屏幕缩放,不论是哪种屏幕适配,都是以这个缩放为基础

已知:设计图手机像素(W,H),设计图上控件的像素值(ViewW,ViewH),目标设备分辨率(TargetW,TargetH)

求:目标设备上view的宽高(TargetViewW,TargetViewH)

公式:宽:ViewW / W TargetW=TargetViewW

高:ViewH / H TargetH =TargetViewH

原理:根据当前设备的分辨率,计算出设计图上的控件在该设备上的缩放比,然后根据缩放比,来动态的设置view, 最终换算出来的单位为px

该适配方式是通过自定义外部的ViewGroup,比如LinearLayout,RelativeLayout,在onMeasure方法中,遍历子view,设置宽高以及padding,margin

以下是封装了一个工具类,用来获取屏幕宽高以及计算缩放比:

未完待续

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

摘自: >

Android横屏竖屏设置

getWindow()setFlags(WindowManagerLayoutParamsFLAG_FULLSCREEN, WindowManagerLayoutParamsFLAG_FULLSCREEN);//设置成全屏模式

setRequestedOrientation(ActivityInfoSCREEN_ORIENTATION_LANDSCAPE););//强制为横屏

setRequestedOrientation(ActivityInfoSCREEN_ORIENTATION_PORTRAIT);//竖屏

我做的东西里面还用到了去掉标题栏。

我也贴出来

requestWindowFeature(WindowFEATURE_NO_TITLE);

垂直居中:

android:layout_centerVertical="true"

水平居中:

android:layout_centerHorizontal="true"

1hideStatusbarAndTitlebar()隐藏statusbar和titlebar

private void hideStatusbarAndTitlebar() {

final Window win = getWindow();

// No Statusbar

winsetFlags(WindowManagerLayoutParamsFLAG_FULLSCREEN,

WindowManagerLayoutParamsFLAG_FULLSCREEN);

// No Titlebar

requestWindowFeature(WindowFEATURE_NO_TITLE);

}

2设置屏幕显示模式ScreenOrientation

在activity里设置android:screenOrientation的值。

android:screenOrientation的属性有以下值:

unspecified(默 认值,由系统判断状态自动切换),The default value The system chooses the orientation The policy it uses, and therefore the choices made in specific contexts, may differ from device to device

landscape,横屏

portrait,竖屏

user(用户当前设置的orientation值),The user's current preferred orientation

behind(下一个要显示的Activity的orientation值),The same orientation as the activity that's immediately beneath it in the activity stack

sensor(传 感器的方向),The orientation determined by a physical orientation sensor The orientation of the display depends on how the user is holding the device; it changes when the user rotates the device

nosensor(不 使用传感器,这个效果差不多等于unspecified)An orientation determined without reference to a physical orientation sensor The sensor is ignored, so the display will not rotate based on how the user moves the device Except for this distinction, the system chooses the orientation using the same policy as for the "unspecified" setting

3水平/垂直居中的方法

设置parent的android:gravity为"center"。

4获得当前屏幕宽高的方法

Display display = getWindowManager()getDefaultDisplay();

ConfigscreenWidth = displaygetWidth();

ConfigscreenHeight = displaygetHeight();

@[TOC](文章目录)

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

# 前言

<font color=#999AAA >使用工具Android studio,利用values文件下dimensxml界面适配安卓屏幕</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|075|

| 中密度(mdpi) |320x480|160|1|

| 高密度(hdpi)|480x800|240| 15|

| 超高密度(xhdpi)|720x1280|320|2|

| 超超高密度(xxhdpi) |1080x1920|480|3|

3由于android的机型屏幕大小品类太多了,有一些是不标准的,这时我们就需要单独去获取屏幕的分辨率和密度了。

# 二、获取屏幕的分辨率和密度

```java

DisplayMetrics displayMetrics = getResources()getDisplayMetrics();

    float density = displayMetricsdensity;

    int densityDpi = displayMetricsdensityDpi;

    int width = displayMetricswidthPixels;

    int height = displayMetricsheightPixels;

    Loge("123","密度:"+density+"---"+densityDpi);

    Loge("123","屏幕分辨率:"+width+"x"+height);

    Loge("123","安卓系统:"+androidosBuildVERSIONRELEASE);

    Loge("123","手表型号:"+androidosBuildPRODUCT);

```

# 三、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](>

以上就是关于android屏幕适配全部的内容,包括:android屏幕适配、Android屏幕适配-应用篇、Android 屏幕适配等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9658784.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存