Android适配

来源:互联网 发布:中国数据统计局 编辑:程序博客网 时间:2024/05/22 12:13
https://developer.android.com/guide/practices/screens_support.html#overview  
http://peng4602.iteye.com/blog/1837474  
https://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch   
https://developer.android.com/training/multiscreen/screensizes.html#TaskUseSizeQuali  
https://developer.android.com/training/multiscreen/index.html 
http://blog.csdn.net/guolin_blog/article/details/8830286  
http://blog.csdn.net/guolin_blog/article/details/50727753  

适配实战:
px (pixels)像素 – 是像素,就是屏幕上实际的像素点单位。
dip或dp (device independent pixels)设备独立像素, 与设备屏幕有关。与终端上的物理像素点无关,是一种基于屏幕密度抽象单位,被称作“设备独立像素”,会随着屏幕的密度进行自动的大小调整.
sp (scaled pixels — best for text size):类似dp, 主要处理字体的大小。
屏幕密度(dpi) :dot per inch,即每英寸像素数。(可使用ppi)
PPI = Pixels per inch,每英寸上的像素数,即 "像素密度"
density:通常我们在Android平台提到的这个不是屏幕密度,而是每英寸的像素点屏幕密度dpi)与160dpi(google设置的一个标准)的比值。
dp是和像素密度无关的。dp的意义是按照mdpi下px:dp = 1:1换算,其他分辨率按照density比例算出来。
densityDpi的值(dpi值)表示每英寸有多少个像素点,单位是dpi。
在160dpi上,160dp就是1英寸,在240dpi上,160dp还是1英寸,120dpi和320dpi也还是1英寸,虽然他们占用的像素数不一样,但是最终显示出来的效果都是占用了屏幕上1英寸的范围。这套体系其实是非常合理的,一个宽为160dp的按钮,它在所有设备上占用的物理尺寸应该是一样大才合理,这应该是Android系统引入dp概念的原因。
dp是与密度无关,sp除了与密度无关外,还与scale无关。如果屏幕密度为160,这时dp和sp和px是一样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的3.2寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成320px的。也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换。
6.1寸 分辨率1280x720  这个手机的 dpi是多少 values-mdpi 是按照 手机dpi来适配的而不是尺寸和分辨率

像素密度和分辨率是两个不同的概念,分辨率是总的像素点,像素密度是单位长度的像素点

HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120

屏幕大小(Screen Size):屏幕的实际尺寸,指屏幕对角线的长度,单位inch,android中根据屏幕大小,把屏幕氛围几个等级:small、normal、large、extra-large



根据 pixel值 =(dpi值/160)* dip值知:
px*160 = dpi*dp
程序中使用dp定义一个宽或高,即dp和160是定值,当dpi变大,px就变大。

Google规定屏幕密度(dpi)就只有
ldpi 低密度 120dpi
mdpi 中密度 160dpi
hdpi 高密度 240dpi
xhdpi 超高密度 320dpi
xxhdpi 超超高密度 480dpi
xxxhdpi 超超超高密度 640dpi

这几种dpi了,自己根据公式算的某一具体手机的dpi取最接近官方定义的dpi。

主流设备(ScreenTest):

                        屏幕密度      密度(density)DPI      DPI宽高            屏幕宽高像素

三星s4:           xxhdpi,             480,               360*640,      1080*1920pixels(1080p)

三星s6 :            xxxhdpi,            640,               360*640,      1440*2560pixels

三星s3mini:     hdpi,                240,               320*533,       480*800pixels

Nexus7(平板):xhdpi,               320,               600*960,       1200*1920pixels

底部带虚拟按键占据实际像素:

Nexus5:         xxhdpi,             480,               360*640,        1080*1920pixels

Sony:              xhdpi,             320,               360*640,        720*1080(720p)


http://www.zhihu.com/question/22181844  

http://blog.csdn.net/tanqiantot/article/details/8777736  

http://blog.csdn.net/ueryueryuery/article/details/20048401   


解决方案:


(1)不同分辨率设备的适配,这点在单位的使用上用dp、sp以及图片资源存放于不同的drawable文件夹就可以解决问题;
(2)不同尺寸的适配,这点主要靠将相关值以及布局文件放置于不同的文件夹中来解决。
values文件夹:可以在工程下创建不同的values文件夹,定义一个变量,每个values设置不同的值。
layout文件夹:如果在不同尺寸设备上展示的布局有明显差别,仅仅用values不同已经难以控制,那么就可以考虑写不同的布局文件置于不同的layout文件夹下,android会根据设备
尺寸去加载相应文件夹下的布局文件。
如果不是很有必要,尽量采用values文件夹

sw<N>dp,如layout-sw600dp, values-sw600dp
这里的sw代表smallwidth的意思,当你所有屏幕的最小宽度都大于600dp时,屏幕就会自动到带sw600dp后缀的资源文件里去寻找相关资源文件,这里的最小宽度是指屏幕宽高的较小值,每个屏幕都是固定的,不会随着屏幕横向纵向改变而改变。

要记住,android屏幕适配终究是相对的,因为尺寸太多,不可能完全适配,所以我们只适配大众的,数量最多的。
其他尺寸的手机怎么办?
我们应该记住这个原则:尽量少用dp定义具体宽度。
我们尽量用dp来表示间隔,而用fill_parent、wrap_parent、weight等属性来使UI进行自动填充。我们需要的是一个适当的比例,而不是精确的尺寸。
多使用权重(android:layout_weight)
设置宽度和高度时,尽量使用match_parent和wrap_content,避免把控件宽高设死
在xml里,设置高度、宽度采用dp(dip),设置字体采用sp


动态代码处理

所以,最为保险的方式,是在代码中,调用:

  1. DisplayMetrics metrics = new DisplayMetrics();
  2. getWindowManager().getDefaultDisplay().getMetrics(metrics);
  3. int screenHalfWidth = metrics.widthPixels / 2;

然后修改view的大小:

  1. view.setLayoutParams(new LayoutParams(screenHalfWidth, LayoutParams.WRAP_CONTENT));


px与dp的代码转换公式:

http://www.oschina.net/question/139589_60142  


补充:
drawable-nodpi 所有密度资源,无论什么密度屏幕都会适配。
drawable-tvdpi 介于mdpi~hdpi 约213dpi 主要应用在电视。
http://www.2cto.com/kf/201411/350915.html 
http://www.2cto.com/kf/201411/352719.html 
补充:
values-sw720dp-land或者port:主要体现在后面两个单词的区别,我们在开发工程中,会遇到横屏和竖屏的情况,所以我们会根据这个后缀名去引用不同布局文件。
values-land(横屏)、values-port(竖屏)

http://blog.csdn.net/chenzujie/article/details/9874859  


其他适配问题:

http://blog.csdn.net/a220315410/article/details/9139397  

http://blog.csdn.net/lnb333666/article/details/7772569
http://www.oschina.net/question/563014_118685
http://www.eoeandroid.com/thread-173973-1-1.html 


layout_weight完成的适配----------------------------------------

layout_weight的真正实现原理(fill_parent和wrap_content的情况):
http://blog.csdn.net/xiechengfa/article/details/38334327 

实际开发应用(往往需要设置android:layout_width="0dp"):

简单理解:当xml中控件制定的宽度或高度不是0而是填充父窗体时,layout_weight权重就不代表将控件平分,而是代表渲染(显示在布局中)的优先级。Weight值越大代表优先级越低,值要取的大一点。
按比例显示LinearLayout内各个子控件,需设置android:layout_width="0dp",如果为竖直方向的设置android:layout_height="0dp"。
Google官方推荐,当使用weight属性时,将width设为0dip即可,设置成0dip会提高性能。
http://zhidao.baidu.com/link?url=0n6gRiIUQm9ja2Mk4Kmb14FANrLy6wTk7ZalSyVUpkDNRPZRVBzJhG-GaYvOHHmUYuu2HYHGWq0yNSPSopMJZ4oHP9s7jwyEBWftIFnZ3cC 


android的多国语言适配----------------------------------------
http://www.cnblogs.com/zyw-205520/p/3848399.html 
http://wenku.baidu.com/link?url=oz1APK1zNN2-EXzCDfnpuXKzX8KFSSHtEiqouGbK7J2P1y4xzqB-2wqvQOrDwlrpHChmo9C6qcW7zpjTfiH0i19rHkm1PFhb7toQldIwQoG 


http://wenku.baidu.com/link?url=GAk6MOleiQT3GrFbG9VxSj-uATKJpERP0gFs9RDP6cRh4JGjqo-k-8pm9YRhfJY_R6V3k1DWPDcJRsm__YcIcouyzzauNWAuYz74l5TUoHG 

http://www.cnblogs.com/zealotrouge/archive/2012/11/23/2784774.html 

http://www.oschina.net/translate/40-developer-tips-for-android-optimization 


mipmap
-----------------------------------------
Mipmaps早在Android2.2+就可以用了,但是直到4.3 google才强烈建议使用。把图片放到mipmaps可以提高系统渲染图片的速度,提高图片质量,减少GPU压力。so,do it。
http://segmentfault.com/q/1010000002603418/a-1020000002603498  



获得屏幕宽高度----------------------------------------------
http://bbs.51cto.com/thread-971016-1.html 
http://www.cnblogs.com/pswzone/archive/2012/03/11/2389993.html 
http://my.oschina.net/u/1162667/blog/188102 
http://blog.sina.com.cn/s/blog_7040845601017wph.html  


使用百分比完成全部适配:
http://blog.csdn.net/lmj623565791/article/details/45460089  
http://blog.csdn.net/youce/article/details/49801339  


http://blog.csdn.net/qq_26787115/article/details/50967896  
0 0
原创粉丝点击