关于Android屏幕适配的一点吐槽

没有银弹

Posted by lx8421bcd on July 5, 2019

不吐不快

之前在QuickDevFramework开发计划中列出了一条提供全屏等比缩放的需求,这两天有点闲,就开始着手研究实现方案,结果一通研究下来,我反倒开始怀疑这条需求的必要性了……

我发现在讨论屏幕适配方面,总有一种思维,就是我把设计稿1:1复刻了就完事了,最好在所有手机上都显示和设计稿比例一摸一样,这是坠吼的,这样子我就没有锅了,适配的难看也是设计的事。这种思维放到5年前,还能说情有可原,到了2018年甚至2019年,居然还有人秉持这种思维,这真的就是态度问题。
这种思维落实到代码实现上,就是无脑全屏等比缩放UI。
在远古时代,大部分手机的dpi相差无几,屏幕比例也基本都是16:9,确实没有必要单独适配。但早在5年前,就已经出现了5.5寸大屏和4.x小屏适配适配的问题了,无脑等比缩放就要面临2两个选择,要么在大屏上放大丑的一批,要么在小屏上缩的要眯着眼睛看;这种方案已经完全违背了大屏显示更多内容小屏方便单手操作的初衷。但还好,都是16:9的屏幕,缩放一下也勉强能看。
到了2018年Android平台迎来了18:9全面屏的潮流,有部分手机甚至做到了19:9,20:9,全屏等比缩放在这种地方就完全吃瘪了。大家有没有发现,市面上流行的所谓屏幕适配“极简”“极低成本”方案,其效果图用的都是16:9的手机屏幕?然而现在无论是iOS还是Android,复杂UI(不能简单拉伸的)都需要考虑两套屏幕比例:16:9和18:9,这之中的差异是全屏等比缩放能解决的么?
之前参考今日头条极简适配方案的github高star AndroidAutoLayout作者,也承认这种方案并不适应新时代

全屏等比缩放有没有用?

有用,但有限定条件:你所适配的设备屏幕比例一致或相近
举个很典型的例子,Android TV端开发,Android TV尺寸变化区间相当大,从30寸到60+寸不等,使用dp值来直接设定控件宽度会相当蛋疼;但绝大部分Android TV的屏幕比例都是16:9,全屏等比缩放正好符合,可以说是绝配。
但目前看来Android Phone和Pad开发都不适用全屏等比缩放,Phone兼顾16:9和18:9已经是客户端开发的新常态,Pad也需要考虑16:9,16:10,4:3等尺寸。

遇到需要等比缩放的需求怎么办

Phone端的开发占Android客户端开发的绝大多数,比较典型,以Phone端为例,Phone端的屏幕高度变化较大,但宽度变化不大,一般可以以宽度作为基准。 推荐使用ConstraintLayout将需要等比缩放的控件包裹,当需要参考屏幕时,以宽度为基准,使用百分比参数进行缩放。


<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <TextView
            android:id="@+id/tv_label"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_gravity="center_vertical"
            android:padding="12dp"
            android:text="需要百分比缩放的控件"
            android:textColor="@color/black"
            android:textSize="16sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" 
            app:layout_constraintWidth_percent="0.5"
            app:layout_constraintHeight_percent="0.2"   
            app:layout_constraintDimensionRatio="H,1.77"
            />

<!-- app:layout_constraintHeight_percent="0.2"  -->
<!-- 相对于父布局高度百分比,如果要16:9和18:9显示一致,需要父布局有绝对高度 -->

<!-- app:layout_constraintDimensionRatio="H,1.77" -->
<!-- 指定宽高比,这个可以根据确定的宽度动态决定控件高度 -->

</androidx.constraintlayout.widget.ConstraintLayout>   

最后的话

希望大家,特别是Android新人,不要初入行就听老玩具说Android屏幕适配特别特别难,然后学些歪门邪道,特别是在商业项目上用这些歪门邪道,最后改回来苦的还是自己。
Android屏幕适配并不难,因为Android屏幕适配并不是客户端开发一边的事,而是美术和客户端开发相互沟通协调共同完成的工作。

记住一点:没有银弹