本人,初级程序猿一枚。本着攻城狮的精神,最近研究了下 Android 屏幕适配的问题 ,这里做下总结。
一、为了解决屏幕适配的问题,一般采用以下几种办法:
1.使用dp布局,尽量少使用px,文字处理的话用sp
2.如果使用切图的话,要注意存放切图的位置,hdpi,mdpi,xhdpi,xxhdpi。还有selector等文件如果有用到切图的时候也注意存放位置昂~~~~
3.自定义View
4.多使用match_parent和weight属性。
5.使用百分比 布局。
6. 在不同的dimen中设置不同的值
7.ScrollView和ListView(RecyclerView)也是不错的选择
8.其实我也不知道写什么,呵呵,那么这个就写做一个有情怀的Android攻城狮,不要为了适配而适配,要站在用户的角度去思考问题,怎么流畅,怎么好用,然后去选择方式去适配。
二、首先解释下3个概念:
1.px (pixels)(像素):屏幕上的点 ,与密度相关。密度大了,单位面积上的px会比较多。
2.dip或dp(与密度无关的像素)。这个和设备硬件有关,为了支持WVGA、HVGA和QVGA 5进制空间推荐使用这个。一种基于屏幕密度的抽象单位。设置一些view的宽高可以用这个,一般情况下,在不同分辨率,都不会有缩放的感觉。如果用px的话,320px占满HVGA的宽度,到WVGA上就只能占一半不到的屏幕了,那一定不是你想要的。
3.sp(与刻度无关的像素)放大像素– 主要处理字体的大小。
dp与px换算公式:
pixs =dips * (densityDpi/160).
dips=(pixs*160)/densityDpi
dp与px转换的方法:
public static int dip2px(Context context, float dipValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(dipValue * scale +0.5f); }
public static int px2dip(Context context, float pxValue){ final float scale = context.getResource().getDisplayMetrics().density; return (int)(pxValue / scale +0.5f); }
三、个人的一些总结
Android中提供了三个存放图片的文件夹,分别为hdpi,mdpi,ldpi,google文档上说,Andriod系统会根据手机屏幕的大小及屏幕密度去选择不同文件夹下的图片资源,以此来实现在不同大小不同屏幕分辨率下适配的问题。
当屏幕density=240时,使用hdpi 标签的资源 当屏幕density=160时,使用mdpi标签的资源 当屏幕density=120时,使用ldpi标签的资源。
各个文件夹的使用顺序:在一个低分辨率的手机上,Android就会选择ldpi文件夹下的图片,但是如果没有在ldpi的文件夹下找见相关的资源文件,Android系统会首先从hdpi文件夹中选择文件,然后对图片资源进行缩放处理,显示在屏幕上;如果hdpi文件夹下也没有的话,会在默认的drawable文件夹中寻找。
总之,为了适屏,Android会在高分辨率文件夹下读取图片,缩小图片,从低分辨率文件夹下读取图片,进行放大处理后 再适屏。
四、百分比适屏
这个不用说了,适屏肯定好用。根据本人写h5的经验,web的大小可以随意改变,适屏用的就是百分比。所以这个用在Android 肯定好用多了 ,O(∩_∩)O~
关于百分比的引用和使用,这里就不做总结了,网上一堆一堆的。推荐个大神写的东西:
http://blog.csdn.net/lmj623565791/article/details/46695347
http://blog.csdn.net/lmj623565791/article/details/46767825
五、设置dimen
<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- values-hdpi 480X800 -->
<dimen name="imagewidth">120dip</dimen>
</resources>
<resources>
<!-- values-hdpi-1280x800 -->
<dimen name="imagewidth">220dip</dimen>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- values-hdpi 480X320 -->
<dimen name="imagewidth">80dip</dimen>
</resources> </span>
六、manifest的配置
要在工程的AndroidManifest.xml文件中,加入supports-screens节点,具体的内容如下:
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" />
这样的话,当前的Android程序就支持了多种分辨率,那么就可以得到正确的物理尺寸了