android适配_android适配器 - CSDN
  • Android 适配横屏

    千次阅读 2015-08-03 16:58:00
    今天书看到Android中横屏的适配。如图,在横屏模式下屏幕布局发生了偏差。 可以看出横屏模式下右侧有明显的空间。 为适配横屏有两种方式,一种是使用相对布局,以屏幕边界作为参照点进行布局。先上图。 ...

    今天书看到Android中横屏的适配。如图,在横屏模式下屏幕布局发生了偏差。


    可以看出横屏模式下右侧有明显的空间。


    为适配横屏有两种方式,一种是使用相对布局,以屏幕边界作为参照点进行布局。先上图。



    布局文件activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Top Left"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"/>
        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Top Right"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"/>
        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Bottom Left"
            android:layout_alignParentLeft="true"
            android:layout_alignParentBottom="true"/>
        <Button
            android:id="@+id/button4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Bottom Right"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"/>
        <Button
            android:id="@+id/button5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Middle"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"/>
    </RelativeLayout>
    


    还有一种方法比较灵活,可以更好的使用横屏下的屏幕布局。

    另一种方法是在resource文件夹下新建layout_land文件夹,然后新建一个与竖屏下布局文件文件名相同的布局文件。

    layout_land/activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Top Left"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"/>
        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Top Right"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"/>
        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Bottom Left"
            android:layout_alignParentLeft="true"
            android:layout_alignParentBottom="true"/>
        <Button
            android:id="@+id/button4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Bottom Right"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"/>
        <Button
            android:id="@+id/button5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Middle"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"/>
        <Button
            android:id="@+id/button6"
            android:layout_width="180dp"
            android:layout_height="wrap_content"
            android:text="Top Middle"
            android:layout_centerHorizontal="true"
            android:layout_alignParentTop="true"/>
        <Button
            android:id="@+id/button7"
            android:layout_width="180dp"
            android:layout_height="wrap_content"
            android:text="Bottom Middle"
            android:layout_centerHorizontal="true"
            android:layout_alignParentBottom="true"/>
    </RelativeLayout>
    

    最后上图。


    展开全文
  • Android适配:字体的大小适配

    千次阅读 2017-02-22 15:22:36
    Android适配:字体的大小适配 Android最让大家头疼的莫过于适配了,由于机型,屏幕等各种原因,适配是真心费劲,在这儿我简单的讲一下个人在项目中字体的一些简单适配方法: 假设需要适应320x240,480x320...

    Android适配:字体的大小适配

    Android最让大家头疼的莫过于适配了,由于机型,屏幕等各种原因,适配是真心费劲,在这儿我简单的讲一下个人在项目中字体的一些简单适配方法:

    假设需要适应320x240,480x320分辨率。在res目录下新建文件夹values-320x240, values-480x320。
    然后在文件夹 values ,values-320x240 和 values-480x320 下新建xml文件dimens.xml,废话不多说,该xml文件内容如下:

    vaules-320x240下的dimens.xml内容如下:

    <!--?xml version="1.0" encoding="utf-8"?-->
    <resources>
        <dimen name="ourTextSize">18sp</dimen>
    </resources>

    values-480x320 下的dimens.xml内容如下:

    <!--?xml version="1.0" encoding="utf-8"?-->
    <resources>
        <dimen name="ourTextSize">18sp</dimen>
    </resources>

    针对不同分辨率的手机,android系统会自动适配加载相应文件中的字体的大小值,ourTextSize的值是不同的。在布局文件中引用的方式如下:

    <TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:gravity="center" 
    android:id="@+id/tv"
    style="@style/text_sp"
    android:textsize="@dimen/ourTextSize">
    </TextView>

    在java文件中这样调用:
    int size= (int)this.getResources().getDimension(R.dimen.Text_size);



    展开全文
  • 关于Android 10.0适配,看这篇就够了

    万次阅读 多人点赞 2019-11-19 13:00:52
    本文将从三个角度介绍Android Q的部分适配问题,也是大家开发适配过程中大概率会遇到的问题: Q 行为变更:所有应用 (不管targetSdk是多少,对所有跑在Q设备上的应用均有影响) Q 行为变更:以 Android Q 为目标...

    本文将从三个角度介绍Android Q的部分适配问题,也是大家开发适配过程中大概率会遇到的问题:

    • Q 行为变更:所有应用 (不管targetSdk是多少,对所有跑在Q设备上的应用均有影响)
    • Q 行为变更:以 Android Q 为目标平台的应用(targetSDK == Q 才有影响)
    • 项目升级遇到的问题

    至于Q的新功能及SDK,项目中并没有涉及,故暂不介绍,只放出链接AndroidQ新API及功能。

    https://developer.android.com/preview/features

    Q行为变更:所有应用

    用户隐私权限变更

    AndroidQ引入了大量更改和限制以增强对用户隐私的保护。

    官方文档将这一部分内容独立于Q 行为变更:所有应用来介绍,是因为这一部分内容庞大且重要,个人认为Q的最大更新就是用户隐私权限变更。具体变更的权限如下:

    权限;   受影响应用;   如何启用(影响范围)

     

     

     

    存储权限

    访问和共享外部存储设备中的文件的应用

    adb shell sm set-isolated-storage on(下文详述)

    定位权限

    在后台时请求访问用户位置信息的应用

    这种权限策略在 Android Q 上始终处于启用状态

    从后台启动 Activity

    不需要用户互动就启动 Activity 的应用

    关闭允许系统执行后台活动开发者选项即可启用限制

    设备标识符(deviceId)

    访问设备序列号或 IMEI 的应用

    在搭载 Android Q 的设备上安装应用

    无线扫描权限

    使用 WLAN API 和 Bluetooth API 的应用

    以 Android Q 为目标平台

     

     

     因为从后台启动Activity权限和无线扫描权限两种权限的变更影响较少。本文不作详述,如有涉及请查阅官方文档。

    https://developer.android.com/preview/privacy/background-activity-starts

    从后台启动Activity权限变更仅针对与用户毫无交互就启动一个Activity的情况,(比如微信登陆授权)

    以下会着重介绍存储权限,定位权限和设备标识符三种权限的变更与适配。

    存储权限

    Android Q 在外部存储设备中为每个应用提供了一个“隔离存储沙盒”(例如 /sdcard)。任何其他应用都无法直接访问您应用的沙盒文件。由于文件是您应用的私有文件,因此您不再需要任何权限即可在外部存储设备中访问和保存自己的文件。此变更可让您更轻松地保证用户文件的隐私性,并有助于减少应用所需的权限数量。

    沙盒,简单而言就是应用专属文件夹,并且访问这个文件夹无需权限。谷歌官方推荐应用在沙盒内存储文件的地址为Context.getExternalFilesDir()下的文件夹。比如要存储一张图片,则应放在Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)中。

    以下将按访问的目标文件的地址介绍如何适配。

    1. 访问自己文件:Q中用更精细的媒体特定权限替换并取消了 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE权限,并且无需特定权限,应用即可访问自己沙盒中的文件。

    2. 访问系统媒体文件:Q中引入了一个新定义媒体文件的共享集合,如果要访问沙盒外的媒体共享文件,比如照片,音乐,视频等,需要申请新的媒体权限:READ_MEDIA_IMAGES,READ_MEDIA_VIDEO,READ_MEDIA_AUDIO,申请方法同原来的存储权限。

    3. 访问系统下载文件:对于系统下载文件夹的访问,暂时没做限制,但是,要访问其中其他应用的文件,必须允许用户使用系统的文件选择器应用来选择文件。

    4. 访问其他应用沙盒文件:如果你的应用需要使用其他应用在沙盒内创建的文件,请点击使用其他应用的文件,本文不做介绍。

    所以请判断当应用运行在Q平台上时,取消对READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE两个权限的申请。并替换为新的媒体特定权限。

    关于存储权限的(如何启用)影响范围

    模拟器

    在Android Q Beat1中,谷歌暂未开放存储权限的改动。我们需要使用adb命令

    adb shell sm set-isolated-storage on

    来开启模拟器对于存储权限的变更来进行适配。

    真机

    当满足以下每个条件时,将开启兼容模式,即不开启Q设备中的存储权限改动:

    1. 应用targetSDK<=P。
    2. 应用安装在从 Android P 升级到 Android Q 的设备上。

    但是当应用重新安装(更新)时,不会重新开启兼容模式,存储权限改动将生效。

    所以按官方文档所说,无论targetSDK是否为Q,必须对应用进行存储权限改动的适配。

    在我的测试中,当targetSDK<=P,在Q Beat1版上申请两个旧权限时会自动改成申请三个新权限,不会影响应用正常使用,但当targetSDK==Q时,申请旧权限将失败并影响应用正常使用。

    定位权限

    为了让用户更好地控制应用对位置信息的访问权限,Android Q 引入了新的位置权限 ACCESS_BACKGROUND_LOCATION。

    与现有的 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限不同,新权限仅会影响应用在后台运行时对位置信息的访问权。除非应用的某个 Activity 可见或应用正在运行前台服务,否则应用将被视为在后台运行。

    与iOS系统一样,Q中也加入了后台位置权限ACCESS_BACKGROUND_LOCATION,如果应用需要在后台时也获得用户位置(比如滴滴),就需要动态申请ACCESS_BACKGROUND_LOCATION权限。

    当然如果不需要的话,应用就无需任何改动,且谷歌会按照应用的targetSDK作出不同处理:

    targetSDK <= P 应用如果请求了ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION权限,Q设备会自动帮你申请ACCESS_BACKGROUND_LOCATION权限。

    设备唯一标识符

    从 Android Q 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 签名权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。

    许多用例不需要不可重置的设备标识符。如果您的应用没有该权限,但您仍尝试查询标识符的相关信息。会返回空值或报错。

    设备唯一标识符需要特别注意,原来的READ_PHONE_STATE权限已经不能获得IMEI和序列号,如果想在Q设备上通过

    ((TelephonyManager) getActivity()      .getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()

    获得设备ID,会返回空值(targetSDK<=P)或者报错(targetSDK==Q)。且官方所说的READ_PRIVILEGED_PHONE_STATE权限只提供给系统app,所以这个方法算是废了。

    谷歌官方给予了设备唯一ID最佳做法,但是此方法给出的ID可变,可以按照具体需求具体解决。

    本文给出一个不变和基本不重复的UUID方法。

    public static String getUUID() {
    
    String serial = null;
    
    String m_szDevIDShort = "35" +
            Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
    
            Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
    
            Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
    
            Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
    
            Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
    
            Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
    
            Build.USER.length() % 10; //13 位
    
    try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            serial = android.os.Build.getSerial();
        } else {
            serial = Build.SERIAL;
        }
        //API>=9 使用serial号
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    } catch (Exception exception) {
        //serial需要一个初始化
        serial = "serial"; // 随便一个初始化
    }
        //使用硬件信息拼凑出来的15位号码
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    }

    虽然由于唯一标识符权限的更改会导致android.os.Build.getSerial()返回unknown,但是由于m_szDevIDShort是由硬件信息拼出来的,所以仍然保证了UUID的唯一性和持久性。

    经测试上述方法完全相同的手机有可能重复,网上还有其他方案比如androidID,但是androidID可能由于机型原因返回null,所以个人任务两种方法半斤八两。设备ID的获取一个版本比一个版本艰难,如果有好的方法欢迎指出。

    minSDK警告

    在 Android Q 中,当用户首次运行以 Android 6.0(API 级别 23)以下的版本为目标平台的任何应用时,Android平台会向用户发出警告。

    如果此应用要求用户授予权限,则系统会先向用户提供调整应用权限的机会,然后才会允许此应用首次运行。

    谷歌要求运行在Q设备上的应用targetSDK>=23,不然会向用户发出警告。

    3.Q 行为变更:以 Android Q 为目标平台的应用

    非 SDK 接口限制

    非SDK接口限制在Android P中就已提出,但是在Q中,被限制的接口的分类有较大变化。

    非SDK接口介绍

    为了确保应用稳定性和兼容性,Android 平台开始限制您的应用可在 Android 9(API 级别 28)中使用哪些非 SDK 接口。Android Q 包含更新后的受限非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。

    非SDK接口限制就是某些SDK中的私用方法,如private方法,你通过Java反射等方法获取并调用了。那么这些调用将在target>=P或target>=Q的设备上被限制使用,当你使用了这些方法后,会报错:

    获取方法

    报错信息

     

     

    Dalvik instruction referencing a field

    NoSuchFieldError thrown

    Dalvik instruction referencing a method

    NoSuchMethodError thrown

    Reflection via Class.getDeclaredField() or Class.getField()

    NoSuchFieldException thrown

    Reflection via Class.getDeclaredMethod(), Class.getMethod()

    NoSuchMethodException thrown

    Reflection via Class.getDeclaredFields(), Class.getFields()

    Non-SDK members not in results

    Reflection via Class.getDeclaredMethods(), Class.getMethods()

    Non-SDK members not in results

    JNI via env->GetFieldID()

    NULL returned, NoSuchFieldError thrown

    JNI via env->GetMethodID()

    NULL returned, NoSuchMethodError thrown

    非SDK接口查找

    如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用进行确认。

    当你调用了非SDK接口时,会有类似Accessing hidden XXX的日志:

    Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)

    但是一个大项目到底哪里使用了这些方法,靠review代码和看日志肯定是不现实的,谷歌官方也提供了官方检查器veridex用来检测一个apk中哪里使用了非SDK接口。veridex下载。

    https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat

    其中有windows,linux和mac版本,对应下载即可。

    下载解压后命令行cd到veridex目录下使用./appcompat.sh --dex-file=Q.apk即可自动扫描。Q.apk为包的绝对路径,如果包与veridex在相同目录下直接输入包文件名即可。

    扫描结果分为两部分,一部分为被调用的非SDK接口的位置,另一部分为非SDK接口数量统计,例如:

    1. greylist: 灰名单,即当前版本仍能使用的非SDK接口,但在下一版本中可能变成被限制的非SDK接口
    2. blacklist:黑名单,使用了就会报错。也是我们项目中必须解决的非SDK接口
    3. greylist-max-o:在targetSDK<=O中能使用,但是在targetSDK>=P中被限制的非SDK接口
    4. greylist-max-p:在targetSDK<=P中能使用,但是在targetSDK>=Q中被限制的非SDK接口

    所以从适配Q的角度出发,除了greylist我们可以暂时不解决以外,其余三种类型的非SDK接口需要我们进行适配。

    非SDK接口适配

    如果您的应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 替代方案。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API。

    官方要求targetSDK>=P的应用不使用这些方法,并寻找其他的公共API去替代这些非SDK接口,如果找不到,则可以向谷歌申请,请求一个新的公共API https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces#feature-request (一般不需要)。

    就我个人扫描并定位的结果来看,项目中使用非SDK接口大概率有以下两种情况:

    1. 在自定义View的过程中为了方便,使用反射修改某个参数。
    2. 三方SDK中使用了非SDK接口(这种情况比较多)。

    第一种是好解决的,毕竟是我们自己写的代码。

    第二种就头疼了,只能更新到最新的三方SDK版本,或者提工单、换库(也是整个适配过程中工作量最庞大的部分)。

    4.项目升级遇到的问题

    模拟器X86,项目中SO库为v7

    • 找到so库源代码,编译成x86
    • 如果so库只是某个功能点使用,对APP整体没大影响,就可以屏蔽特定so库功能或略过测试
    • 如果so库是项目核心库必须加载,也可使用腾讯云测,上面有谷歌亲儿子Q版本。腾讯云测有adb远程连接调试功能(我没成功过)。adb连不上也没关系,直接安装就行,云测上也可以直接看日志。
    • 至于inter的houdini我尝试研究过,理论上能安装在x86模拟器上让它编译v7的so库,但是由于关于houdini的介绍比较少也比较旧,建议大家时间不充裕的话就别研究了。

    Requires development platform Q but this is a release platform.

    由于目前Q是preview版,所以targetSDK==Q 的应用只能在Q设备上跑。

    INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2

    这个错误是由于打包压缩so库时造成的,具体原因可见

    https://issuetracker.google.com/issues/37045367

    在AndroidManifest.xml的application节点下加入android:extractNativeLibs="true"

    可能有人加了上面代码还是不行,在app/build.gradle中的defaultConfig节点下加入

    packagingOptions{ 
          doNotStrip "/armeabi/.so" doNotStrip "/armeabi-v7a/.so" doNotStrip "/x86/.so" }

    Didn't find class “org.apache.http.client.methods.HttpPost"

    在AndroidManifest.xml的application节点下加入

    <uses-library android:name="org.apache.http.legacy" android:required="false"/>

    如果你的项目没有适配过android O或P,那么你需要注意:

    1. android O的读取已安装应用权限(对应用内自动更新有影响)
    2. android P的默认禁止访问http的API

    这两个版本的适配问题本文就不做详述,网上有很多详细的介绍。

    参考文献

    官方文档

    https://developer.android.com/preview

    出处:云栖社区 https://cloud.tencent.com/developer/article/1437956

    如果对您能有所帮助,请点个赞吧亲!!!

     

     

    展开全文
  • Android适配-ROM适配

    千次阅读 2018-03-10 18:20:38
    一、手机平台相关文档(一)小米1、小米开发者文档2、开发人员必看:《小米应用开发者文档》在这里可以找到在小米手机上开发、分发应用的相关文档~3、常见问题4、小米帐号场景化登录5、技术文档(二)华为华为开发者...

    一、手机平台相关文档

    (一)小米

    1、小米开发者文档
    2、开发人员必看:《小米应用开发者文档》

    在这里可以找到在小米手机上开发、分发应用的相关文档~

    3、常见问题
    4、小米帐号场景化登录
    5、技术文档

    (二)华为

    华为开发者文档

    (三)魅族

    魅族开发者文档

    (四)三星

    三星开发者文档

    (五)oppo

    oppo开发者文档

    oppo手机的R9系列和A系列的5.1系统存在严重的bug,类似以下这种的gc导致的释放超时很多。


    (六)vivo

    vivo开发者文档

    二、开发中遇到的问题在不同手机上的处理方式

    (一)沉浸式状态栏适配

    • 这里讲一下华为手机沉浸式状态栏和虚拟键盘冲突问题怎么解决:

    由于指数限制,详细代码请看我的github https://github.com/AweiLoveAndroid/Solve-StatusBar-VirtualKeyBoard

    (二)沉浸式状态栏图标的适配

    • 2.2.1 小米MIUI系统适配

    之前做沉浸式状态栏,由于公司APP底色是白色,所以对MIUI进行特殊处理。在MIUI V6及以上版本,调用MIUI的方法将状态栏图标改为黑色。发现部分小米手机,这样的设置不管用,导致头上一片白,状态栏上的东西基本看不到。

    调整过程中发现以下情况:

    手机型号MIUI版本Android版本系统方法是否生效MIUI的方法是否生效
    红米 NOTE 1LTEMIUI 8 8.2.1稳定版4.4生效
    小米5MIUI 8 8.5.3稳定版7.0生效
    MI 3WMIUI 9 7.9.14开发版6.0.1生效

    参考官方文档: http://www.miui.com/thread-8946673-1-1.html

    (三)应用卸载然后安装更新的适配

    • 2.3.1 华为适配
      华为手机程序卸载,安装更新包,还是提醒更新包与安装应用签名不一致。

    • 2.3.2 魅族适配

      • 问题1. 测试的签名和你正式出包的签名如果不一致就不能安装,卸载应用也没用。
      • 问题2. 用as安装过应用,卸载后安装正式的apk就安装不了,用adb命令卸载后就行了。

    (四)改变状态栏字体颜色为黑色的适配

    • 2.4.1 小米适配
    /**
     * 改变小米的状态栏字体颜色为黑色,要求MIUI6以上
     * tested on: MIUI V7 5.0 Redmi-Note3
     */
    private void processMIUI(boolean lightStatusBar) throws Exception{
        Window window = getWindow();
        Class<? extends Window> clazz = window.getClass();
        int darkModeFlag;
        Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
        Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
        darkModeFlag = field.getInt(layoutParams);
        Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
        extraFlagField.invoke(window,lightStatusBar ? darkModeFlag : 0, darkModeFlag);
    }
    
    • 2.4.2 魅族适配
    /**
     * 改变魅族的状态栏字体为黑色,要求FlyMe4以上
     */
    private void processFlyMe(boolean isLightStatusBar) throws Exception{
        Window window = getWindow();
        WindowManager.LayoutParams layoutParams = window.getAttributes();
        Class<?> instance = Class.forName("android.view.MiuiWindowManager$LayoutParams");
        int value = instance.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON").getInt(layoutParams);
        Field field = instance.getDeclaredField("meizuFlags");
        field.setAccessible(true);
        int origin = field.getInt(layoutParams);
        if(isLightStatusBar){
            field.set(layoutParams, origin | value);
        }else{
            field.set(layoutParams, -value | origin);
        }
    
    }
    

    下面来一张示例图:

    (五)屏幕圆角实现和适配

    示例图
    • 实现原理:利用WindowManager将我们的圆角加到屏幕的四个角,圆角颜色设置为黑色,形成视觉圆角屏幕。

    下面简单的把一些核心代码讲一下:

    • ** 自定义圆角View,这里以左上角为例:**
    // top left
    case Gravity.TOP | Gravity.LEFT:
        path.moveTo(0.0f, 0.0f);
        path.lineTo(0.0f, (float) h);
        path.arcTo(new RectF(0.0f, 0.0f,
                ((float) w) * 2.0f, ((float) h) * 2.0f), 180.0f, 90.0f, true);
        path.lineTo((float) w, 0.0f);
        path.lineTo(0.0f, 0.0f);
        path.close();
        break;
    
    • windowmanager在添加view的时候需要设置一个WindowManager.LayoutParams。下面初始化这个Params:
    // window manager
    manager = (WindowManager) this.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    params = new WindowManager.LayoutParams();
    /*
     系统提示类型:7.0以前可以直接用TOAST的类型,不用申请权限,直接添加
     7.0以后不行了,需要申请SYSTEM_ALERT_WINDOW权限,window type最好
     设置为ERROR 或者 PHONE
     */
    if (Utilities.isCanUseToastType()) {
        params.type = WindowManager.LayoutParams.TYPE_TOAST;
    } else {
        params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
    }
    params.format = 1;
    params.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN // 全屏
            | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS // 覆盖到status bar
            | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION // 覆盖到导航栏
    
            // 以下属性设置加载我们圆角window 不抢焦点,不拦截事件
            | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
    params.alpha = 1.0f;
    params.x = 0;
    params.y = 0;
    // 设置  大小为全屏
    params.width = ViewUtil.getScreenSize(this).x;
    params.height = ViewUtil.getScreenSize(this).y;
    
    
    
    • 圆角加到屏幕上:
    public void addCornerViewByPosition(String position){
        boolean enable = true;
        switch (position) {
            case LEFT_TOP:
                enable = leftTopEnable;
                params.gravity = Gravity.TOP | Gravity.LEFT;
                break;
            case RIGHT_TOP:
                enable = rightTopEnable;
                params.gravity = Gravity.TOP | Gravity.RIGHT;
                break;
            case LEFT_BOTTOM:
                enable = leftBottomEnable;
                params.gravity = Gravity.BOTTOM | Gravity.LEFT;
                break;
            case RIGHT_BOTTOM:
                enable = rightBottomEnable;
                params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
                break;
        }
        CornerView corner = buildCorner(enable,params.gravity);
        if(!corners.containsValue(corner)) {
            corners.put(position, corner);
            manager.addView(corner, params);
        }
    }
    

    屏幕圆角实现和适配,详细的可以点击这里:http://mp.weixin.qq.com/s/h5qRvfgVj04f_xExTtrIHg

    (六)在带虚拟按键的手机上,虚拟按键会遮挡全屏图片的底部的解决。

    在做splash页面的时候,通过windowBackground设置背景图片,在带虚拟按键的手机上,虚拟按键会遮挡图片的底部,这个问题的解决方式:

    参考:http://blog.csdn.net/c15522627353/article/details/52452490

    (六)悬浮窗权限设置了,dialog还是不提示。



    展开全文
  • android 平板适配

    万次阅读 2018-09-25 11:49:33
    首次进行平板开发,从一开始就在琢磨适配是怎么弄的,百度、google、群一大圈,还是没人告诉具体是怎么做的,都是基本的概念性的讲述怎么适配,写了一个界面发现存在很大适配问题,最后找到了几篇有价值的博客,文章...
  • Android屏幕适配最优方案

    万次阅读 2019-12-05 14:53:31
    一、今日头条屏幕适配方案 今日头条屏幕适配方案的核心原理在于,根据以下公式算出density 当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = density density的意思就是1 dp占当前设备多少像素 为...
  • Android 屏幕适配方案

    万次阅读 多人点赞 2015-08-01 13:20:53
    1、概述大家在Android开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比。如果我们换个角度我们看下这个问题,不知道大家有没有了解过web前端开发,或者说大家对于网页都不陌生吧,其实...
  • android 适配

    2019-03-19 20:21:52
    Android系统发布十多年以来,关于Android的UI的适配一直是开发环节中最重要的问题,但是我看到还是有很多小伙伴对Android适配方案不了解。刚好,近期准备对糗事百科Android客户端设计一套UI尺寸适配方案,可以和小...
  • Android Q 适配详细操作

    千次阅读 2019-08-22 16:23:14
    1.API在28以下的未适配Android X 的项目适配Android Q。 2.已经适配Android X 的被应用市场平台要求项目适配Android Q。 思路就是,先适配Android X(适配过的跳过),再从Android X 适配Android Q。
  • 安卓适配详解

    千次阅读 2018-01-06 11:54:12
    概述一直想把安卓开发过程中所有的关于不同手机类型,手机系统,及API版本的适配做一个整理,这些内容虽然简单但细节太多,所以想整理一下,以便自己的总结,由于各种原因一直被放下,现在下定决心会持续更新博客上...
  • Android 屏幕适配:最全面的解决方案

    千次阅读 2018-05-09 10:12:04
    本文将结合:Google的官方权威适配文档郭霖: Android官方提供的支持不同屏幕大小的全部方法Stormzhang:Android 屏幕适配鸿洋:Android 屏幕适配方案凯子: Android屏幕适配全攻略(最权威的官方适配指导)自身的思考...
  • Android适配之适配不同语言,即国际化概述国际化,能够让我们的app被使用不同国家地域使用,感觉是件很酷的事情。但是,市场上大部分app都没有做国际化方面的工作,因为没有必要,大点的app,如微信,微博等也只是多...
  • Android适配--dimen

    千次阅读 2016-05-20 09:50:45
    说起Android适配,大家是不是觉得特别头疼,但是Android适配技能是每个Android程序员必备的,也是面试中会必须问到的。 适配的方式有好多种,什么图片适配啊,布局适配啊,当然还有现在的开源框架,当然,或许有人...
  • Android适配之适配不同的系统版本

    千次阅读 2015-11-05 16:36:04
    Android适配之适配不同的系统版本前言新的Android版本会为你的app提供更棒的APIs,但你的app仍应该支持旧版本的Android,直到更多的设备升级到新版本为止。这节课程向你展示如何在利用新的APIs的同时仍支持旧版本...
  • Android适配低内存

    千次阅读 2014-12-02 20:19:55
    Android适配低内存 5.1 介绍 Android现在支持512MB内存的设备。该文档的旨在指导OEMs厂商优化和配置android4.4上的低内存设备。 5.2 Android平台优化 5.2.1 改善内存管理
  • Android适配解决方案

    千次阅读 2017-01-13 15:37:33
    昨天就这个问题去找答案,结果最后扯到了Android适配上,本来吧我觉得自己开发Android这么久了,适配什么的早已不是问题,但是图样图森破啊,还是太年轻。目录(已经掌握的部分可以跳过):基础知识(dp,px,dpi,sp...
  • Android适配(图片、布局)

    千次阅读 2016-12-08 14:26:20
    Android适配 首先屏幕适配这个问题已经困扰了我很久,一直没有找到很好的解决办法,看了鸿洋大神的博客感觉发现了新大陆一样,以后适配可以像web开发一样利用百分比来控制控件的大小和排版了,谷歌给我们提供了...
  • Android适配之今日头条适配方案

    千次阅读 2019-08-30 11:18:38
    前介: 头条适配是根据设计图宽度,算出density(可以理解为密度),继而算出dpi,替换系统中的dpi.则XML即可按照UI所给设计图设置宽度...import android.app.Application; public class App extends Application{ @Ov...
  • Android屏幕适配全攻略(最权威的官方适配指导)

    万次阅读 多人点赞 2015-10-29 14:37:36
    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因、重要概念、解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的...
  • 一个类搞定Android适配!!

    千次阅读 2016-05-22 14:43:39
    Android之屏幕适配问题,有需要的朋友可以参考下。 Android设备繁多,屏幕标准不一,更有让人头疼的定制rom,开发中有时候真的很蛋疼,这点上就没IOS好,下面我分享下我在项目中是如何适配的: 我们UI只切...
1 2 3 4 5 ... 20
收藏数 77,626
精华内容 31,050
关键字:

android适配