屏幕渲染高度计算完后怎么把内容渲染到剩余空间里面?也就是根据屏幕渲染的宽高来决绝显示多少内容

以下是Demo首页的预览图
demo下载:
一、细说layout_weight
& &&目前最为推荐的Android多屏幕自适应解决方案。
& & 该属性的作用是决定控件在其父布局中的显示权重,一般用于线性布局中。其值越小,则对应的layout_width或layout_height的优先级就越高,一般横向布局中,决定的是layout_width的优先级;纵向布局中,决定的是layout_height的优先级。
& & 传统的layout_weight使用方法是将当前控件的layout_width和layout_height都设置成fill_parent,这样就可以把控件的显示比例完全交给layout_weight;这样使用的话,就出现了layout_weight越小,显示比例越大的情况。不过对于2个控件还好,如果控件过多,且显示比例也不相同的时候,控制起来就比较麻烦了,毕竟反比不是那么好确定的。
& &&于是就有了现在最为流行的0px设值法。看似让人难以理解的layout_height=0px的写法,结合layout_weight,却可以使控件成正比例显示,轻松解决了当前Android开发最为头疼的碎片化问题之一。
& &&先看下面的styles(style_layout.xml)
&?xml version=&1.0& encoding=&utf-8&?&
&resources&&&
&!-- 全屏幕拉伸--&
&&&style name=&layout_full&&&&
&&& &item name=&android:layout_width&&fill_parent&/item&&&
&&& &item name=&android:layout_height&&fill_parent&/item&&&
&&&/style&
&!-- 固定自身大小--&
&&&style name=&layout_wrap&&&&
&&& &item name=&android:layout_width&&wrap_content&/item&&&
&&& &item name=&android:layout_height&&wrap_content&/item&&&
&&&/style&
&!-- 横向分布--&
&&&style name=&layout_horizontal& parent=&layout_full&&&&
&&& &item name=&android:layout_width&&0px&/item&&&
&&&/style&
&!-- 纵向分布--&
&&&style name=&layout_vertical& parent=&layout_full&&&&
&&& &item name=&android:layout_height&&0px&/item&&&
&&&/style&
&/resources&&&
可以看到,layout_width和layout_height两个属性被我封装成了4个style
& & 根据实际布局情况,选用当中的一种,不需要自己设置,看过我前一个ActivityGroup的Demo的同学应该非常熟悉了
& & 然后我的Demo的布局如下(weight_layout.xml)
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
&&& & & style=&@style/layout_full&
&&& & & android:orientation=&vertical&&
&&& & & &LinearLayout
&&& & & & & & & style=&@style/layout_vertical&
&&& & & & & & & android:layout_weight=&1&
&&& & & & & & & android:orientation=&horizontal&&
&&& & &&&& & & & &View
&&& & &&&& & & & & & & & style=&@style/layout_horizontal&
&&& & &&&& & & & & & & & android:background=&#aa0000&
&&& & &&&& & & & & & & & android:layout_weight=&1&/&
&&& & &&&& & & & &View
&&& & &&&& & & & & & & & style=&@style/layout_horizontal&
&&& & &&&& & & & & & & & android:background=&#00aa00&
&&& & &&&& & & & & & & & android:layout_weight=&4&/&
&&& & &&&& & & & &View
&&& & &&&& & & & & & & & style=&@style/layout_horizontal&
&&& & &&&& & & & & & & & android:background=&#0000aa&
&&& & &&&& & & & & & & & android:layout_weight=&3&/&
&&& & &&&& & & & &View
&&& & &&&& & & & & & & & style=&@style/layout_horizontal&
&&& & &&&& & & & & & & & android:background=&#aaaaaa&
&&& & &&&& & & & & & & & android:layout_weight=&2&/&& & & &&&& & & &
&&& & & &/LinearLayout&
&&& & & &LinearLayout
&&& & & & & & & style=&@style/layout_vertical&
&&& & & & & & & android:layout_weight=&2&
&&& & & & & & & android:orientation=&vertical&&
&&& & & & & & & &View
&&& & &&&& & & & & & & & style=&@style/layout_vertical&
&&& & &&&& & & & & & & & android:background=&#ffffff&
&&& & &&&& & & & & & & & android:layout_weight=&4&/&& & & &
&&& & &&&& & & & &View
&&& & &&&& & & & & & & & style=&@style/layout_vertical&
&&& & &&&& & & & & & & & android:background=&#aa0000&
&&& & &&&& & & & & & & & android:layout_weight=&3&/&
&&& & &&&& & & & &View
&&& & &&&& & & & & & & & style=&@style/layout_vertical&
&&& & &&&& & & & & & & & android:background=&#00aa00&
&&& & &&&& & & & & & & & android:layout_weight=&2&/&
&&& & &&&& & & & &View
&&& & &&&& & & & & & & & style=&@style/layout_vertical&
&&& & &&&& & & & & & & & android:background=&#0000aa&
&&& & &&&& & & & & & & & android:layout_weight=&1&/&
&&& & & &/LinearLayout&
&/LinearLayout&
整个界面布局看起来非常直观,只是嵌套的逻辑要自己理下。显示效果如下图,其中左面一个是480x800的界面,右面的是320x480的界面(后面的图也如此),可以看出显示比例和代码中完全一致,我就不多说了,大家对照下就能看出来了。
二、自定义尺寸法
& & 这个是我自己想出来的方法,可能是个比较笨的方法,所以没有多少人提过用这种方法解决自适应的问题。虽然这个方法缺点也很多,但有时候也是个不错的方法。
& & 先看下面这张图
& &&&可以看到我定义了两套尺寸文件,我们可以看下其中一个文件
&?xml version=&1.0& encoding=&utf-8&?&
&resources&
&dimen name=&height_1_80&&6px&/dimen&&dimen name=&height_2_80&&12px&/dimen&
&dimen name=&height_3_80&&18px&/dimen&&dimen name=&height_4_80&&24px&/dimen&
&dimen name=&height_5_80&&30px&/dimen&&dimen name=&height_6_80&&36px&/dimen&
&dimen name=&height_7_80&&42px&/dimen&&dimen name=&height_8_80&&48px&/dimen&
&dimen name=&height_9_80&&54px&/dimen&&dimen name=&height_10_80&&60px&/dimen&
&dimen name=&height_11_80&&66px&/dimen&&dimen name=&height_12_80&&72px&/dimen&
&dimen name=&height_13_80&&78px&/dimen&&dimen name=&height_14_80&&84px&/dimen&
&dimen name=&height_15_80&&90px&/dimen&&dimen name=&height_16_80&&96px&/dimen&
&dimen name=&height_17_80&&102px&/dimen&&dimen name=&height_18_80&&108px&/dimen&
&dimen name=&height_19_80&&114px&/dimen&&dimen name=&height_20_80&&120px&/dimen&
&dimen name=&height_21_80&&126px&/dimen&&dimen name=&height_22_80&&132px&/dimen&
&dimen name=&height_23_80&&138px&/dimen&&dimen name=&height_24_80&&144px&/dimen&
&dimen name=&height_25_80&&150px&/dimen&&dimen name=&height_26_80&&156px&/dimen&
&dimen name=&height_27_80&&162px&/dimen&&dimen name=&height_28_80&&168px&/dimen&
&dimen name=&height_29_80&&174px&/dimen&&dimen name=&height_30_80&&180px&/dimen&
&dimen name=&height_31_80&&186px&/dimen&&dimen name=&height_32_80&&192px&/dimen&
&dimen name=&height_33_80&&198px&/dimen&&dimen name=&height_34_80&&204px&/dimen&
&dimen name=&height_35_80&&210px&/dimen&&dimen name=&height_36_80&&216px&/dimen&
&dimen name=&height_37_80&&222px&/dimen&&dimen name=&height_38_80&&228px&/dimen&
&dimen name=&height_39_80&&234px&/dimen&&dimen name=&height_40_80&&240px&/dimen&
&dimen name=&height_41_80&&246px&/dimen&&dimen name=&height_42_80&&252px&/dimen&
&dimen name=&height_43_80&&258px&/dimen&&dimen name=&height_44_80&&264px&/dimen&
&dimen name=&height_45_80&&270px&/dimen&&dimen name=&height_46_80&&276px&/dimen&
&dimen name=&height_47_80&&282px&/dimen&&dimen name=&height_48_80&&288px&/dimen&
&dimen name=&height_49_80&&294px&/dimen&&dimen name=&height_50_80&&300px&/dimen&
&dimen name=&height_51_80&&306px&/dimen&&dimen name=&height_52_80&&312px&/dimen&
&dimen name=&height_53_80&&318px&/dimen&&dimen name=&height_54_80&&324px&/dimen&
&dimen name=&height_55_80&&330px&/dimen&&dimen name=&height_56_80&&336px&/dimen&
&dimen name=&height_57_80&&342px&/dimen&&dimen name=&height_58_80&&348px&/dimen&
&dimen name=&height_59_80&&354px&/dimen&&dimen name=&height_60_80&&360px&/dimen&
&dimen name=&height_61_80&&366px&/dimen&&dimen name=&height_62_80&&372px&/dimen&
&dimen name=&height_63_80&&378px&/dimen&&dimen name=&height_64_80&&384px&/dimen&
&dimen name=&height_65_80&&390px&/dimen&&dimen name=&height_66_80&&396px&/dimen&
&dimen name=&height_67_80&&402px&/dimen&&dimen name=&height_68_80&&408px&/dimen&
&dimen name=&height_69_80&&414px&/dimen&&dimen name=&height_70_80&&420px&/dimen&
&dimen name=&height_71_80&&426px&/dimen&&dimen name=&height_72_80&&432px&/dimen&
&dimen name=&height_73_80&&438px&/dimen&&dimen name=&height_74_80&&444px&/dimen&
&dimen name=&height_75_80&&450px&/dimen&&dimen name=&height_76_80&&456px&/dimen&
&dimen name=&height_77_80&&462px&/dimen&&dimen name=&height_78_80&&468px&/dimen&
&dimen name=&height_79_80&&474px&/dimen&&dimen name=&height_80_80&&480px&/dimen&& &
&/resources&
这个是values-480x320文件夹下dimens_height.xml文件中的代码,我把整个高度分成了80等分,这是因为大部分屏幕的宽度或高度都是80的整数倍(个别特殊的除外),不同的等分在不同的分辨率中设定不同的尺寸值。
& & 由于每一套界面都要写一套,所以有些同学可能觉着不太好,不过这个写起来比较简单,而且以后也不用改,所以有时候也可以考虑用一下!
& & 再看我Demo的布局代码(dimen_layout.xml)
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
&&& & & android:layout_width=&fill_parent&
&& & & & android:layout_height=&fill_parent&
&&& & & android:orientation=&vertical&&
&&& & &&&& & & & &View
&&& & &&&& & & & & & & & android:layout_width=&@dimen/width_76_80&
&&& & &&&& & & & & & & & android:layout_height=&@dimen/height_10_80&
&&& & &&&& & & & & & & & android:background=&#ffcccc&
&&& & &&&& & & & & & & & android:layout_margin=&@dimen/width_2_80&/&& & & &
&&& & & &LinearLayout
&& & & & & & & & android:layout_width=&fill_parent&
&& & & & & & & & android:layout_height=&fill_parent&&
&&& & &&&& & & & &View
&&& & &&&& & & & & & & & android:layout_width=&@dimen/width_30_80&
&&& & &&&& & & & & & & & android:layout_height=&@dimen/height_50_80&
&&& & &&&& & & & & & & & android:background=&#ccccff&
&&& & &&&& & & & & & & & android:layout_margin=&@dimen/height_5_80&/&
&&& & & & & & &&&&LinearLayout
&&& & &&&& & & & & & & & android:layout_width=&fill_parent&
&&& & &&&& & & & & & & & android:layout_height=&fill_parent&
&&& & &&&& & & & & & & & android:orientation=&vertical&&& & & &
&&& & &&&& & & & & & & & &Button
&&& & & & & & &&&& & & & & & & & android:layout_width=&@dimen/width_30_80&
&&& & & & & & &&&& & & & & & & & android:layout_height=&@dimen/height_5_80&
&&& & & & & & &&&& & & & & & & & android:background=&#ccffcc&
&&& & & & & & &&&& & & & & & & & android:layout_marginBottom=&@dimen/height_1_80&
&&& & & & & & &&&& & & & & & & & android:text=&5&/&
&&& & & & & & &&&& & & & &Button
&&& & & & & & &&&& & & & & & & & android:layout_width=&@dimen/width_30_80&
&&& & & & & & &&&& & & & & & & & android:layout_height=&@dimen/height_10_80&
&&& & & & & & &&&& & & & & & & & android:background=&#ccffcc&
&&& & & & & & &&&& & & & & & & & android:layout_marginBottom=&@dimen/height_1_80&
&&& & & & & & &&&& & & & & & & & android:text=&10&/&
&&& & & & & & &&&& & & & &Button
&&& & & & & & &&&& & & & & & & & android:layout_width=&@dimen/width_30_80&
&&& & & & & & &&&& & & & & & & & android:layout_height=&@dimen/height_15_80&
&&& & & & & & &&&& & & & & & & & android:background=&#ccffcc&
&&& & & & & & &&&& & & & & & & & android:layout_marginBottom=&@dimen/height_1_80&
&&& & & & & & &&&& & & & & & & & android:text=&15&/&
&&& & & & & & &&&& & & & &Button
&&& & & & & & &&&& & & & & & & & android:layout_width=&@dimen/width_30_80&
&&& & & & & & &&&& & & & & & & & android:layout_height=&@dimen/height_20_80&
&&& & & & & & &&&& & & & & & & & android:background=&#ccffcc&
&&& & & & & & &&&& & & & & & & & android:text=&20&/&
&& & & & & & & & &/LinearLayout&& & & &
&& & & & &/LinearLayout&& & & & & & & &
&/LinearLayout&
以上是我写的统一的布局代码,来看下在两个不同分辨率的模拟器上的显示效果吧(大家注意我的代码中有margin这样的值也用到了自定义尺寸,如果这个margin使用layout_weight来控制的话,无疑要多嵌套一层线性布局,所以说没有一个方法是十全十美的,这第2个方法有时候用起来反而还要方便一些)
三、在java代码中设置宽高度
& & 也许很多人会反对这种方法,因为即使是官方也是推荐使用xml的方式写布局。不过我们在这不会像Swing那样写那么多麻烦的布局代码,因为我们只是在代码中重新设定控件的宽高度而已,其他属性依然是交给xml布局文件的。这个方法其实是我跟同事偷学来的,虽然我不赞成这样的方法,但他确确实实也是解决屏幕自适应问题的方案之一,而且它没我想象的那么复杂,其实很简单。
& & 首先我们要做的是获取当前屏幕的宽高度,因为这个在后面要用到
& & 我们可以写两个静态变量用来保存当前屏幕的宽高度:
public class Constant {
&&&& &&&public static int displayW&&//屏幕宽度
&&&& &&&public static int displayH //屏幕高度
然后在第一个Activity启动的时候,获取这两个值
&&&& && && &DisplayMetrics displayMetrics = new DisplayMetrics();
&&&& && && && & getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
&&&& && && && & Constant.displayWidth = displayMetrics.widthP
&&&& && && && & Constant.displayHeight = displayMetrics.heightP
&布局代码我们可以全都统一写成wrap-content,其实写成什么都无所谓,因为这个值只是暂时的&
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
&&& android:orientation=&vertical&
&&& android:layout_width=&fill_parent&
&&& android:layout_height=&fill_parent&&
&&& & & android:id=&@+id/btn1&
&&& android:layout_width=&wrap_content&
&&& android:layout_height=&wrap_content&
&&& android:background=&#ffcccc&
&&& android:text=&aaaaaaaa&/&
&&& & & android:id=&@+id/btn2&
&&& android:layout_width=&wrap_content&
&&& android:layout_height=&wrap_content&
&&& android:background=&#ccffcc&
&&& android:text=&bbbbbbbbb&/&
&&& & & android:id=&@+id/btn3&
&&& android:layout_width=&wrap_content&
&&& android:layout_height=&wrap_content&
&&& android:background=&#ccccff&
&&& android:text=&ccccccccc&/&
&&& & & android:id=&@+id/btn4&
&&& android:layout_width=&wrap_content&
&&& android:layout_height=&wrap_content&
&&& android:background=&#ffffcc&
&&& android:text=&dddddddddddddddddd&/&& &
&/LinearLayout&
最后我们在Activity的onCreate方法里这么做&
// 第一个按钮,宽度100%,高度10%
&&& & & & & & & LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
&&& & & & & & & & & & & & & & & LayoutParams.FILL_PARENT,
&&& & & & & & & & & & & & & & & (int) (Constant.displayHeight * 0.1f + 0.5f));
&&& & & & & & & btn1.setLayoutParams(params);
&&& & & & & & & // 第二个按钮,宽度100%,高度30%
&&& & & & & & & LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(
&&& & & & & & & & & & & & & & & LayoutParams.FILL_PARENT,
&&& & & & & & & & & & & & & & & (int) (Constant.displayHeight * 0.3f + 0.5f));
&&& & & & & & & btn2.setLayoutParams(params2);
&&& & & & & & & // 第三个按钮,宽度50%,高度20%
&&& & & & & & & LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams(
&&& & & & & & & & & & & & & & & (int) (Constant.displayWidth * 0.5f + 0.5f),
&&& & & & & & & & & & & & & & & (int) (Constant.displayHeight * 0.2f + 0.5f));
&&& & & & & & & btn3.setLayoutParams(params3);
&&& & & & & & & // 第三个按钮,宽度70%,高度填满剩下的空间
&&& & & & & & & LinearLayout.LayoutParams params4 = new LinearLayout.LayoutParams(
&&& & & & & & & & & & & & & & & (int) (Constant.displayWidth * 0.7f + 0.5f),
&&& & & & & & & & & & & & & & & LayoutParams.FILL_PARENT);
&&& & & & & & & btn4.setLayoutParams(params4);
大家可以看到其实代码并不复杂,都能看得懂
& & 下面是效果显示图
四、多布局
& & 做为最后的方法,也是最后一个才会考虑的方法,那就是为不同的尺寸界面单独写布局。不到万不得已不要用这个方法,相信不少人和我一样都被逼着用过这个方法吧。需要说明的是,横竖屏切换使用不同布局也是用这个方法解决的;代码我就不上了,给大家看两张图吧,一个是同1个布局的,一个是写了多布局的,大家一看就明白了
补充一下,写多个布局的时候,配置文件一定要加上这段配置代码,不然有时可能会出问题
& & &supports-screens :largeScreens=&true&
& && && && && & android:normalScreens=&true& android:anyDensity=&true& /&
& ignore_js_op&
& & 以上说的都是多个屏幕显示相同内容需要考虑的问题,还有一种是在不同的屏幕上显示内容不同的情况,其实这个问题我们往往是用滚动视图来解决的,也就是ScrowView;需要注意的是ScrowView中使用layout_weight是无效的,既然使用ScrowView了,就把它里面的控件的大小都设成固定的吧。
& & 此外关于图片的自适应问题,主要是2点,一个是9patch图,这个东西大家都要学会去做,不难;不过有些编译器在识别9patch图时会出这样那样的bug,像我的Eclipse就不认这个,而同一个9patch图在别的电脑上却是没问题的,
& & 第二个要说的是我曾经被困扰的一个问题,对于480x800&和&480x854这两个尺寸,他们显示同一个图片时,总有一个会拉伸(如果9patch可以解决的还好)。其实当初困扰我的是,这两个尺寸都是hdpi的,以为无法给这两个屏幕做不同的图片。后来无意中发现,图片可以和布局一样分多个尺寸的,而不仅仅是根据密度分,也就是说你可以写这样的文件夹drawable-hdpi-800x480和drawable-hdpi-854x480,在它们里面放不同的图片,这样图片也能自适应了。
本文已收录于以下专栏:
相关文章推荐
       作为Android开发人员,最头疼的莫过于让自己开发的程序在不同终端上面的显示效果看起来尽量一致(当然,如果要充分利用大屏幕的优势另当别论)。在全球范围内来讲,android有...
Android布局之屏幕自适应
         在做应用时发现程序没有屏幕自适应功能,变换手机使用之后,界面就很混乱了,字体也很奇怪。经过百度的帮助,找到自适应方法。
1   &#16...
Google终于开始支持百分比的方式布局了,瞬间脉动回来,啊咧咧。对于这种历史性的时刻,不出篇博客难以表达我内心的激动。,本文分为3个部分:
PercentRelativeLayout、Percent...
android界面适配的难是历史原因,我们只能想办法解决。github上面已有一些布局自适应的解决方案,今天我分享的是自定义控件:RelativieLayout自适应百分比宽高。实现的原理其实很简单,...
以下是Demo首页的预览图
demo下载:/forum.php?mod=attachment&aid=NjE0Njh8ZTIyZ...
以下是Demo首页的预览图
demo下载:/forum.php?mod=attachment&aid=NjE0Njh8ZTI...
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
概述进程间通信的一个小事例
1 应用服务端2 应用客户端3 运行的效果
应用层的具体流程分析google源码层的具体走向...
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
Toolbar是什么如何使用Toolbar
简单使用稍复杂一点使用
Toolbar让标题居中显示
Android Studio比Eclipse ADT有巨大的优势。Android Studio原生支持使用Gradle来构建项目,使用动态语言Groovy定义项目构建的过程,避免了build.xml文...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)不同分辨率下容易出现的问题
& & & &由于目前android设备的分辨率种类很多,在开发的时候不注意进行屏幕适配的话会出现很多问题。
比如高分辨率和低分辨率下的图片显示问题,在高分辨率下显示低分辨率图片显示质量下降。还有屏幕长宽
比不同的情况下会出现布局移位,甚至是整个页面错乱的情况。还有字体设置,在不同分辨率下使用同一字
体可能会导致字体显示大小不一的情况。以上问题,有的可以通过变量使用非固定值来解决,有的可以通过
google官方提供的方法进行解决,有的则需要使用一些特殊方法来进行解决。以下是我调查的一些方法可以
供大家参考。
屏幕分辨率中的几个概念
以下是根据Google官方文档翻译过来的屏幕分辨率中的一些概念。
1.屏幕尺寸:屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如2.8寸,3.5寸)。Android把所有的屏幕尺寸简化为三大类:
大,正常,和小。程序可以针对这三种尺寸的屏幕提供三种不同的布局方案,然后系统会负责把你的布局方案以合适的方式渲染
到对应的屏幕上,这个过程是不需要程序员用代码来干预的。
2. &屏幕长宽比:屏幕的物理长度与物理宽度的比例。程序可以为制定长宽比的屏幕提供制定的素材,只需要用系统提供的资源
分类符long和notlong。
3. &分辨率:屏幕上拥有的像素的总数。注意,虽然大部分情况下分辨率都被表示为“宽度×长度”,但分辨率并不意味着屏幕
长宽比。在Android系统中,程序一般并不直接处理分辨率。
4 .密度:以屏幕分辨率为基础,沿屏幕长宽方向排列的像素。密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的
屏幕通常则会有很多——甚至会非常非常多——像素排列在同一区域。屏幕的密度是非常重要的,举个例子,长宽以像素为单位定
义的界面元素(比如一个按钮),在低密度的屏幕上会显得很大,但在高密度的屏幕上则会显得很小。
5. &密度无关的像素(DIP):指一个抽象意义上的像素,程序用它来定义界面元素。它作为一个与实际密度无关的单位,帮助程
序员构建一个布局方案(界面元素的宽度,高度,位置)。一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为160DPI
的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度作为基准,
“透明地”处理所有需要的DIP缩放操作。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式:
pixels = dips * (density /160)。举个例子,在DPI为240的屏幕上,1个DIP等于1.5个物理像素。
我们强烈推荐你用DIP来定义你程序的界面布局,因为这样可以保证你的UI在各种分辨率的屏幕上都可以正常显示。
官方文档中的建议
Google官方文档中提出了一些关于屏幕分辨率适配的建议。
1 &声明最小支持分辨率:在manifest文件中声明android:requiresSmallestWidthDp、android:compatibleWidthLimitDp、
android:largestWidthLimitDp,限定分辨率。
2 &在分辨率中使用wrap_content, fill_parent,或者dp单位。例如,在layout_width=&100dp&这个声明下,如果是中等分
辨率屏幕下代表着100个像素点宽的距离,而在高等分辨率屏幕下代表着150像素点的距离。同样的,你可以使用sp单位来定义
字体大小。
3 &在代码中尽量不使用硬性定义。使用myView.getWidth()在当前屏幕下得到了10的值,但是可能在另一个屏幕下会得到15的值。
所以在代码中使用硬性定义的话,会导致屏幕不适配的问题。
4 &不使用绝对布局。绝对布局是根据像素点排列的,在项目中推荐使用相对布局。
5 &针对不同尺寸和不同密度采用不同的资源。尽管系统可以自动识别屏幕大小并作出资源图片的调整,如果想让图片资源保持不同
方向比例一致的话,还是在资源中添加多个资源。如果需要精确地摆放图片位置的话,建议修整图片到合适的大小,并根据图片密度
放在不同的文件夹下,例如drawable-mdpi和drawable-ldpi里。
调查到的解决方法几种
以下是根据网上的一些方法总结的解决方法,都已经做过实例测试方法可用,但是没有在具体的项目中使用过,可以参考。
& & & &在布局文件中使用weight来控制位置。将控件的layout中的width、height设置为fill-parent,不要使用
wrap-content。因为wrap-content的大小是不固定的。而weight(权重)这个属性很好的解决了这个问题。当包裹在控件
外面的Layout的width、height属性都设置为fill-parent时,可以利用weight的反比特性。即如果控件A设置weight为9,
控件B设置weight为20,那么A所占的空间为20/(9+20),B所占的空间为9/(9+20)。这样的反比属性对任何分辨率下的
手机都是合适的。
& & & 在布局文件中使用weight也可以使用wrap-content,这时的话就是正比例计算,即如果控件A设置weight为9,
控件B设置weight为20,那么A所占的空间为9/(9+20)
& & & 字体大小的设置。需要在res文件夹中创建一个文件夹,叫做values-。其中是手机屏幕的分辨率,
根据手机屏幕的情况做不同的命名,一定要保留res里默认的dimens.xml文件,这样的话可以再屏幕分辨率不适应的情况下
找到字体大小。
& & & 屏幕自适应可能会出现识别错误问题,加载了低分辨率图片到中分辨率手机上,这个时候也可以删除掉drawable-hdpi、
drawable-mdpi、drawable-ldpi三个文件夹,创建一个drawable文件夹即可。也可以将资源文件放入assets中,
因为assets中的资源系统永远不会为其生成id,所以不会智能缩放。还有设置最低版本,把1.5以下的版本支持去掉也可以
产生一些作用。,B所占的空间为20/(9+20)。缺点是当content内容的大小特殊的情况下,这个比例不会被执行。
例如values-800x480。在该文件夹下创建一个dimens.xml文件,定义各种字体的大小。那么系统就会自动根据你手机屏幕的分辨率
去调用响应的文件夹。需要注意的是,
& & 一些比较极端的情况,比如0x768 ,这里可以使用一个兼容性的布局,如果里面含有图片而且对于
宽度要求十分精确地话,建议修正图片大小或者做填充处理(在边缘为纯色的情况下将背景填充为和边缘颜色一样的色值即可)。
Android9 patch 图片 (.9.png 格式图片) 的特点和制作
一.9.png格式的文件的特点
& &与传统的png 格式图片相比, 9.png 格式图片在图片四周有一圈一个像素点组成的边沿,该边沿用于对图片的可扩展区和内容
显示区进行定义。这种格式的图片在android 环境下具有自适应调节大小的能力。(1)允许开发人员定义可扩展区域,当需要延伸图
片以填充比图片本身更大区域时,可扩展区的内容被延展。(2)允许开发人员定义内容显示区,用于显示文字或其他内容. 如下图所示:
左侧和上方的黑线交叉的部分即可扩展区域,右侧和下方的黑线交叉的部分即内容显示区.
& & & & & & & & & & & & & & &&
二 .9.png 图片的制作
& android sdk 的 tools文件夹下提供了制作该格式图片的工具 draw9patch.bat。使用此工具打开任意图片之后,将鼠标置于图片上。
& 被黑色覆盖的是不可编辑(锁住)的区域,周围的一圈一个像素的边沿是可编辑区域。按住鼠标左键,在左侧和上方的边沿画出可扩展区。
在右侧和下方画出内容显示区。完成绘制以后,选择file-& save ,即可保存为 .9.png 格式的文件,并在android项目中使用。
实际项目中,其他公司决绝方案
1.屏幕大小
& 在res目录下创建不同的layout文件夹,比如:layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,
而系统会根据屏幕的大小自己选择合适的layout进行使用。
2.字体自适应大小
& 首先根据不同分辨率获取不同字体大小。&
在RES里创建
values-480x320/strings.xml 里面设置&dimenname=&Text_size&&30px&/dimen&
和 values-800x400/strings.xml 里面设置&dimenname=&Text_size&&30px&/dimen&
分别代表480X320 和 800X400分辨率情况下 字号为30px和40
在java文件中这样调用:int sizeOfText = (int)this.getResources().getDimension(R.dimen.Text_size);
用密码获取屏幕宽高,根据图片原比例,在代码中自己设置高宽。
WindowManager wm = (WindowManager) this
& & & & & & & & & & & & & & & & .getSystemService(Context.WINDOW_SERVICE);
& & & & & & & & width= wm.getDefaultDisplay().getWidth();// 屏幕宽度
& & & & & & & & minHight= width * 381 / 480;
& & & & & & & & calenderTableLayout.setMinimumHeight((int)minHight);
& & & & 做一张超大的图片,然后等比例缩小图片,来进行图片的适配。
本文已收录于以下专栏:
相关文章推荐
这篇文章首先我自己感觉,有点儿个人化的味道~为什么这么说? 因为很遗憾,我这里实现 “ ViewPager宽度铺满、高度自适应 ” 的方法又和网上其他的不太一样。虽然我依然是只写了几句代码来实现这个要...
有必要了解的 Android中常见的单位 dip, dp, px, sp之间的区别:
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这...
转自:/royi123/archive//2939109.html
各种Android操作系统的手机简直就是琳琅满目,屏幕分辨...
由于OEM之间的竞争,各种Android操作系统的手机简直就是琳琅满目,屏幕分辨率的差异可想而知。目前比较主流的有WVGA=800x480,HVGA=480x320,另外的还有QVGA=320x240...
各种Android操作系统的手机简直就是琳琅满目,屏幕分辨率的差异可想而知。目前比较主流的有WVGA=800x480,HVGA=480x320,另外的还有QVGA=320x240。当然还有魅族M9的D...
有必要了解的 Android中常见的单位
dip, dp, px, sp之间的区别:
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果...
目前比较主流的有WVGA=800x480,HVGA=480x320,另外的还有QVGA=320x240。当然还有魅族M9的DVGA=960x640,还有蛋疼的摩托罗拉的FWVGA=854x480。
各种Android操作系统的手机简直就是琳琅满目,屏幕分辨率的差异可想而知。目前比较主流的有WVGA=800x480,HVGA=480x320,另外的还有QVGA=320x240。当然还有魅族M9的D...
Android不同手机屏幕分辨率自适应 
  各种Android操作系统的手机简直就是琳琅满目,屏幕分辨率的差异可想而知。目前比较主流的有WVGA=800x480,HVGA=480x3...
呵呵,相信各位Android开发爱好者都知道,由于OEM之间的竞争,各种Android操作系统的手机简直就是琳琅满目,屏幕分辨率的差异可想而知。目前比较主流的有WVGA=800x480,HVGA=48...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 屏幕渲染 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信