Android屏幕适配篇(一)
2016-03-06 23:22
447 查看
Android碎片化特别严重,屏幕适配一直都是热点讨论的话题,可能你想过很多办法,最后都不是很满意。
屏幕适配篇(一)也是基础篇,主要是对一些基础概念的讲解,如果你已经了解,请关注(二)。
dip和dp是一个意思,即Density Independent Pixels的缩写,dp和px又是如何换算的呢?
在Android中,规定以160dpi为基准,1dip=1px,如果密码是480dpi,则1dpi=3px,以此类推。下面我们来看一个假设,在屏幕上我们画一条320px的线,在840*800分辨率的手机上显示为屏幕的2/3,在320*480分辨率的手机上则占满了屏幕的宽度。如果使用dp为单位,在这两种分辨率的手机上,显示一样的长度,这也是我们在写布局的时候尽量使用dp而不是px的原因。而sp可以根据文字大小首选项进行缩放,是设置字体大小的单位。
对于以上五种主流的像素密度,应按照2:3:4:6:8的比例进行缩放。从android 4.3 mipmap文件夹已经替换掉了drawable文件夹。mipmap文件夹性能更好,占用内存更少。所以现在官方推荐使用mipmap。
android:layout_width=”0dp”
效果图:
如果红色TextView的layout_weight=“2”呢:
那么layout_weight所占父控件的比例公式为:子控件的weight值/(所有子控件的weight值的和)*父控件的宽度或者是高度。
android:layout_width=”wrap_content”
效果图:
结论:子控件的weight值/(所有子控件的weight值的和)* 剩余空间的宽度或高度。
注意:有些资料可能没有区分清楚wrap_content 和 0dp 的情况,或者说它们情况是一样的。
android:layout_width=”match_parent”
效果图:
结论:假设每个TextView的宽度为match_parent,如果我们设父控件的宽度为M,那么每个TextView的宽度都为M,那么剩余的宽度我们就可以求出来 M-(M+M)=-M。红色TextView的weight=1,剩余的宽度占比为:1/(1+2)=1/3,所有我们就得出了它的最终宽度为M+1/3*(-M)=2/3M,蓝色的TextView所占宽度同浅绿色TextView的算法,最终宽度为M+2/3*(-M)=1/3M。
理解清楚了一些基本概念,下篇我会讲解怎么去实现屏幕适配。敬请大家关注屏幕适配篇(二)
屏幕适配篇(一)也是基础篇,主要是对一些基础概念的讲解,如果你已经了解,请关注(二)。
1、屏幕尺寸**
屏幕的尺寸指的是屏幕对角线的长度,单位是英寸(1英寸=2.54厘米)。常见的屏幕尺寸有 4.0,5.0,5.5,6.0,8.0,10.0等,平时我们说你手机又多大,这里指的就是屏幕尺寸。2、屏幕分辨率**
屏幕分辨率指的是屏幕上横向,纵向上的像素点数量。单位是px,1px=1个像素点。我们通常以横向像素*纵向像素来表示。如320*480,1080*1920等。3、屏幕像素密度**
密度跟数学上的密度有些相似,指的是每英寸上的像素点数,单位是dpi。当然密度越大屏幕越清晰。在单一变化的条件下,屏幕尺寸越小,分辨率越高,像素密度就越大,反之越小。dip和dp是一个意思,即Density Independent Pixels的缩写,dp和px又是如何换算的呢?
/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); }
在Android中,规定以160dpi为基准,1dip=1px,如果密码是480dpi,则1dpi=3px,以此类推。下面我们来看一个假设,在屏幕上我们画一条320px的线,在840*800分辨率的手机上显示为屏幕的2/3,在320*480分辨率的手机上则占满了屏幕的宽度。如果使用dp为单位,在这两种分辨率的手机上,显示一样的长度,这也是我们在写布局的时候尽量使用dp而不是px的原因。而sp可以根据文字大小首选项进行缩放,是设置字体大小的单位。
4、mdpi(1x)、hdpi(1.5x)、xdpi(2x)、xxdpi(3x)
mdpi、hdpi、xdpi、xxdpi用来修饰Android中drawable文件夹及values文件夹,用来区分不同像素密度下的图片和dimen值。在进行开发的时候,我们需要把合适大小的图片放到合适的文件夹里面:drawable文件夹 | 图片尺寸 |
---|---|
mdpi(~160dpi) | 48x48dp |
hdpi(~240dpi) | 72x72dp |
xhdpi(~320dpi) | 96x96dp |
xxhdpi(~480dpi) | 144x144dp |
xxxhdpi(~640dpi) | 192x192dp |
5、线性布局中weight(权重)的使用
相信大家一定对weight不陌生,我们可以使用这个属性来按照比例对界面进行分配,完成一些特殊的需求。那么我们如何来理解它呢?下面我简单的举个列子:android:layout_width=”0dp”
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="0dp" android:layout_height="32dp" android:layout_weight="1" android:background="#ff0000"></TextView> <TextView android:layout_width="0dp" android:layout_height="32dp" android:layout_weight="1" android:background="#00ff00"></TextView> </LinearLayout>
效果图:
如果红色TextView的layout_weight=“2”呢:
那么layout_weight所占父控件的比例公式为:子控件的weight值/(所有子控件的weight值的和)*父控件的宽度或者是高度。
android:layout_width=”wrap_content”
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="32dp" android:layout_weight="2" android:text="你是红色" android:background="#ff0000"></TextView> <TextView android:text="我是蓝色" android:layout_width="wrap_content" android:layout_height="32dp" android:layout_weight="1" android:background="#00ff00"></TextView> </LinearLayout>
效果图:
结论:子控件的weight值/(所有子控件的weight值的和)* 剩余空间的宽度或高度。
注意:有些资料可能没有区分清楚wrap_content 和 0dp 的情况,或者说它们情况是一样的。
android:layout_width=”match_parent”
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="match_parent" android:layout_height="32dp" android:layout_weight="1" android:text="你是红色" android:background="#ff0000"></TextView> <TextView android:text="我是蓝色" android:layout_width="match_parent" android:layout_height="32dp" android:layout_weight="2" android:background="#00ff00"></TextView> </LinearLayout>
效果图:
结论:假设每个TextView的宽度为match_parent,如果我们设父控件的宽度为M,那么每个TextView的宽度都为M,那么剩余的宽度我们就可以求出来 M-(M+M)=-M。红色TextView的weight=1,剩余的宽度占比为:1/(1+2)=1/3,所有我们就得出了它的最终宽度为M+1/3*(-M)=2/3M,蓝色的TextView所占宽度同浅绿色TextView的算法,最终宽度为M+2/3*(-M)=1/3M。
理解清楚了一些基本概念,下篇我会讲解怎么去实现屏幕适配。敬请大家关注屏幕适配篇(二)
相关文章推荐
- Android开发60条技术经验总结
- 【Android】TextView中Spannable对象的使用
- android生命周期详解
- android ViewDragHelper详解
- 给初学者的 Android 加密工具
- 《Android开发艺术探索》读书笔记 (4) 第4章 View的工作原理
- 使用Android studio对Android应用签名
- android ViewFlipper实现图片轮播
- 14、 android性能优化总结
- android线程池
- android Bitmap用法总结
- Android自定义ImageView(二)——实现双击放大与缩小图片
- Android在onCreate()方法中动态获取TextView控件的高度
- Android访问SD卡的工具类
- 【黑马Android】(01)android简介/工程目录结构/拨号器/四种点击事件/后台偷偷发短信
- Android拖动和缩放
- Android拖拽和缩放
- CardGame猜牌小游戏
- Android学习笔记之Intent(2)
- android开发之路06(浅谈单例设计模式)