遇到的问题

在项目开发中遇到屏幕底部或顶部出现了黑条,页面没有全部占满屏幕,情况如下:

解决方案

影响因素:
1 项目 targetSdkVerion 值
2 项目是否支持分屏模式:
如果设置了android:resizeableActivity=“true”,则代表支持分屏模式。(此设置只针对Activity有效)

设置最大纵横比方法:
方法一: 在AndroidManifest.xml中节点下做如下配置即可:

<meta-dataandroid:name="android.max_aspect"android:value="ratio_float"/>

其中ratio_float为浮点数,官方建议为2.1或更大,因为18.5:9=2.055555555……,如果日后出现纵横比更大的手机,此值将需要设为更大。

方法二:max_aspect值也可以在Java代码中动态地设置,通过下面的方法即可实现:

public void setMaxAspect() {ApplicationInfo applicationInfo = null;try {applicationInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}if(applicationInfo == null){throw new IllegalArgumentException(" get application info = null, has no meta data! ");}applicationInfo.metaData.putString("android.max_aspect", "2.1");}

场景1:
targetSdkVerion >= 26或者支持分屏模式,删除最大纵横比设置:
删除最大纵横比方法:删除android:name="android.max_aspect"即可,Android会自动根据屏幕调节(推荐)
场景2:
targetSdkVerion >= 26且不支持分屏模式时,删除最大纵横比设置或者将其设置为最大值:
(1)删除最大纵横比方法:删除android:name="android.max_aspect"即可,Android会自动根据屏幕调节(推荐)
(2)设置最大纵横比

<meta-dataandroid:name="android.max_aspect"android:value="2.4"/>

场景三:
targetSdkVerion <= 25且不支持分屏模式时(android:resizeableActivity API 级别 24 添加的,如果应用面向 API 级别 24 或更高级别,但未对该属性指定值,则该属性的值默认设为 true):
默认的apsect ratio为1.86,必须对最大纵横比进行设置,否则在大于1.86的手机上运行App会出现黑条的现象。

<meta-dataandroid:name="android.max_aspect"android:value="2.4"/>

解释下什么是最大屏幕纵横比


理解:
当Activity设置了分屏模式:android:resizeableActivity=“true”,则maxAspectRatio属性将失效(即"android.max_aspect"属性将不起作用)

原理:

// 解析activity时候如设置了maxAspectRatio就将设置好的传输进去。private Activity parseActivity(Package owner, Resources res,XmlResourceParser parser, int flags, String[] outError, CachedComponentArgs cachedArgs,boolean receiver, boolean hardwareAccelerated)throws XmlPullParserException, IOException {if (sa.hasValue(R.styleable.AndroidManifestActivity_maxAspectRatio)&& sa.getType(R.styleable.AndroidManifestActivity_maxAspectRatio)== TypedValue.TYPE_FLOAT) {a.setMaxAspectRatio(sa.getFloat(R.styleable.AndroidManifestActivity_maxAspectRatio,0 /*default*/));}....
//接着看一下setMaxAspectRatio,先判断是否可以resize,也就是前面的android:resizeableActivity="false"。
private void setMaxAspectRatio(float maxAspectRatio) {if (info.resizeMode == RESIZE_MODE_RESIZEABLE|| info.resizeMode == RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION) {// Resizeable activities can be put in any aspect ratio.return;}if (maxAspectRatio < 1.0f && maxAspectRatio != 0) {// Ignore any value lesser than 1.0.return;}info.maxAspectRatio = maxAspectRatio;mHasMaxAspectRatio = true;}//如果没有该属性 再设置默认的。private static final float DEFAULT_PRE_O_MAX_ASPECT_RATIO = 1.86f;..../*** Sets every the max aspect ratio of every child activity that doesn't already have an aspect* ratio set.*/private void setMaxAspectRatio(Package owner) {// Default to (1.86) 16.7:9 aspect ratio for pre-O apps and unset for O and greater.// NOTE: 16.7:9 was the max aspect ratio Android devices can support pre-O per the CDD.float maxAspectRatio = owner.applicationInfo.targetSdkVersion < O? DEFAULT_PRE_O_MAX_ASPECT_RATIO : 0;//android o 之前的用默认1.86,之后的就根据手机;屏幕。if (owner.applicationInfo.maxAspectRatio != 0) {// Use the application max aspect ration as default if set.maxAspectRatio = owner.applicationInfo.maxAspectRatio;} else if (owner.mAppMetaData != null&& owner.mAppMetaData.containsKey(METADATA_MAX_ASPECT_RATIO)) {maxAspectRatio = owner.mAppMetaData.getFloat(METADATA_MAX_ASPECT_RATIO, maxAspectRatio);}for (Activity activity : owner.activities) {// If the max aspect ratio for the activity has already been set, skip.if (activity.hasMaxAspectRatio()) {continue;//如果activity已经有这个属性了就不在重新设置,如果没有在设置一个默认的。}// By default we prefer to use a values defined on the activity directly than values// defined on the application. We do not check the styled attributes on the activity// as it would have already been set when we processed the activity. We wait to process// the meta data here since this method is called at the end of processing the// application and all meta data is guaranteed.final float activityAspectRatio = activity.metaData != null? activity.metaData.getFloat(METADATA_MAX_ASPECT_RATIO, maxAspectRatio): maxAspectRatio;activity.setMaxAspectRatio(activityAspectRatio);}}
// frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java
/*** Computes the bounds to fit the Activity within the bounds of the {@link Configuration}.*/// TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer.private void computeBounds(Rect outBounds) {outBounds.setEmpty();final float maxAspectRatio = info.maxAspectRatio;final ActivityStack stack = getStack();if (task == null || stack == null || !task.mFullscreen || maxAspectRatio == 0|| isInVrUiMode(getConfiguration())) {// We don't set override configuration if that activity task isn't fullscreen. I.e. the// activity is in multi-window mode. Or, there isn't a max aspect ratio specified for// the activity. This is indicated by an empty {@link outBounds}. We also don't set it// if we are in VR mode.return;//如果是0直接就pass了没有后面计算过程了。}...

Android全面屏最大纵横比适配相关推荐

  1. 小米android 18比9黑边,Android 全面屏黑边适配

    问题: 全面屏底部会出现黑边 原因: 全面屏宽高比例比较特殊,不是之前的16:9.例如小米mix2s,屏幕宽高比是18:9.Android默认支持的最大宽高比例是1.86,小于全面屏手机的宽高比例.所 ...

  2. Android 全面屏黑边适配

    问题: 全面屏底部会出现黑边 原因: 全面屏宽高比例比较特殊,不是之前的16:9(默认1.86 准确点应该是16.7:9).例如小米mix2s,屏幕宽高比是18:9.Android默认支持的最大宽高比 ...

  3. android 小米8底部黑色高度太高,Android 全面屏黑边适配

    问题: 全面屏底部会出现黑边 原因: 全面屏宽高比例比较特殊,不是之前的16:9(默认1.86 准确点应该是16.7:9).例如小米mix2s,屏幕宽高比是18:9.Android默认支持的最大宽高比 ...

  4. Android 全面屏的那些适配方法

    版权申明:未经允许请勿转载.转载前请先联系作者(hello@yeshen.org) 原本以为只是很简单的功能.虽然最后发现确实是简单的功能. 但是前前后的调整接近一天,这里留下记录,如何处理吧. 一. ...

  5. Android 全面屏处理(适配挖孔屏、刘海屏) kotlin

    测试机: Android 11 的 Xiaomi MI MAX 3 Android 12 的 Xiaomi K40 Pro 测试方法: 1. 该方法在api30后提示已经过时 在onCreat()方法 ...

  6. Android全面屏适配问题:华为p40

    华为p40,android 全面屏适配问题: 解决方案: AndroidManifest.xml里面如下几处修改: <?xml version="1.0" encoding= ...

  7. Android 全面屏手机view出现绿色边框

    Android 全面屏手机view出现绿色边框 在公司的华为P20手机上出现此情况,参考了https://my.oschina.net/u/3959253/blog/1941582发现好像其他的全面屏 ...

  8. Android 全面屏适配及判断是否为全面屏,全面屏手势和虚拟导航栏的判断

    一,全面屏的适配 全面屏出现后,如果不做适配,屏幕上会出现上下黑边,影响视觉效果. 针对此问题,Android官方提供了适配方案,即提高App所支持的最大屏幕纵横比,实现起来也比较简单,在Androi ...

  9. Android全面屏适配

    什么是全面屏 概念 很多人可能把全面屏跟曲面屏混淆,其实这是两个不同的概念. 一般手机的屏幕纵横比为16:9,如1080x1920.1440x2560等,其比值为1.777777--,全面屏手机出现之 ...

最新文章

  1. 利用Mircosoft URLRewriter.dll实现asp.net页面伪静态
  2. batch 批处理获取系统时间
  3. SAP 销售订单删除及如何查已删除的单
  4. 向Window窗体发送消息,控制程序的运行.
  5. visio思维导图模板_如何下载思维导图模板?在线教你找精美漂亮的思维导图
  6. 前端学习(3067):vue+element今日头条管理-频道筛选完成
  7. 学习和使用web标准的十大理由
  8. 双重检查锁定及单例模式
  9. 读-深入理解Java虚拟机(1-2章)随笔
  10. select下拉选择框
  11. ios app应用开发环境配置方法总结
  12. maya2018 bonus tools - Arnold材质库1489行报错问题解决方法
  13. 全球名校课程作业分享系列(6)--斯坦福计算机视觉与深度学习CS231n之神经网络细解与优化尝试
  14. python tkinter画布设置按钮对图片放大缩小_Tkinter可调整大小的对象Python画布
  15. code first修改表或字段
  16. 数据库的主键约束和自增长
  17. apicloud加java,【APICloud】App开发中加入系统分享功能案例源码分享
  18. CMMI-3级kpa
  19. golang gin框架gorilla的websocket小案例
  20. C语言基础——求一个三位数的个位十位百位

热门文章

  1. 简单几步教你如何看k线图图解
  2. DM8168 Uboot使用EMAC1(TI源码使用默认的EMAC0)
  3. 软件设计模式从何而来?------“抄袭来的” 设计模式
  4. 美中嘉和在港交所招股书失效:去年亏损约5亿元,杨建宇为实控人
  5. 宏碁传奇Go评测 怎么样
  6. 去除WinRar中广告的办法
  7. 计算机科学丛书之第9章和第10章代码
  8. 农业大田作物智慧种植科研
  9. DeepFlow: Deep Learning-Based Malware Detection by Mining Android Application for Abnormal Usage 2
  10. MySQL数据库名字能不能用中划线 ‘-’ ?