http://314858770.iteye.com/blog/1495864
先说下现在市面上TV分辨率的大概情况
两种分辨率为主
1.720标清,分辨率为1366x768.
屏幕尺寸以32寸为主,部分电视为42寸
2.1080p全高清,分辨率为1920x1080
屏幕尺寸以42寸为主,此分辨率电视屏幕从32寸到50寸都有
适配遇到问题,已1080p尺寸为例:
分辨率固定不变,屏幕尺寸变化较大。
如:效果图尺寸为1920x1080,如果使用dp进行布局设计,并且要实现和效果图一样的显示,则需要根据不同尺寸进行适配,也就是要每个尺寸都要有一套布局文件。同样720p的也要每个尺寸一个布局文件。这样的话布局文件太多将无法维护。
因为分辨率相同但屏幕尺寸不同,所以每个尺寸的dp密度值也不相同。这样一个控件在同样分辨率不同尺寸上面显示的效果和设计效果图上面肯定也不相同。
那么如何适配分辨率固定但屏幕密度值不同的电视呢?
1.使用dp设定控件尺寸,为每个密度值单独设定一套布局文件
优点:可以进行部分自适应,如1280x720中等密度(mdpi)尺寸的布局可以自适应到1920x1080高密度(hdpi)的屏幕
缺点:布局文件数膨胀,维护困难,有新的尺寸则需要新增新的布局文件进行适配
使用dp时,实际的适配只要保证一个尺寸的最佳显示效果,其他尺寸仅作兼容可以适当降低显示效果。这样基本就只需要一套最佳适配布局,一套兼容适配布局。说的简单,做起来有点困难。。。
2.使用px设定控件尺寸,根据分辨率适配布局
优点:只需要适配1920x1080和1280x720两个分辨率的布局文件,最多两套布局
缺点:使用了不被推荐的绝对像素进行控件设计,在ADT-18的插件上每个布局文件都会有一个警告的提示。。。
再说下适配固定分辨率不同密度的布局文件命名:
如:
1920x1080分辨率,高密度屏幕 布局文件目录名为layout-hdpi-1920x1080
1920x1080分辨率,中密度屏幕 布局文件目录名为layout-mdpi-1920x1080
720p的适配同理
ps:在设计布局时多使用相对定位,则能让部分页面布局可以适应大多说的分辨率。所以需要适配的布局应该不会很多的。
以上为个人最TV适配的理解,仅供看客参考。如果有错误也请指正,以免继续误导别人。
android 手机上的适配:
现在适配更多的解决办法是在项目中建立不同分辨率的layout文件夹(像系统默认提供的drawable文件夹一样)来适应不同的屏幕,但是这样做太复杂了,现在屏幕分辨率还不算多,如果再过几年,魅族再出个奇葩分辨率屏幕,步步高、三星再出个盾牌大小的手机,我们难道再添加不同屏幕的layout文件夹吗?这当然是不可取的。那么最好的办法就是从代码中去适配屏幕了,这也是本文所要讲的。
首先说一下ViewGroup,在ViewGroup类中有一个叫LayoutParams的内部类。我们可以通过构造方法创建一个layoutparams,当然更好的办法是所有的View都有一个方法叫getLayoutParams(),调用view的这个方法,我们可以获取到这个View所在的父控件的layoutparams属性。
这里需要注意一点,就是View的父控件几乎不可能是直接的ViewGroup,而更多的可能是LinearLayout.LayoutParams,RelativeLayout.LayoutParams等布局的属性,这时直接去用ViewGroup的LayoutParams去操作是没有用的,我们需要强转成父控件类型的LayoutParams。
此时我们可以通过获取到屏幕的宽度,计算出希望控件占有屏幕的百分比(我通常是用宽度乘以80%),自己手动设置layoutparams.leftMargin与layoutparams.rightMargin这两个值。从字面上大家应该就能理解了,这两个值就是左边距和右边距。此时控件就是以百分比的形式占在屏幕的中间了。
最后,一定不要忘记了最关键的一步,把我们修改过的params重新设置给View:view.setlayoutparams(params);这样就完成我们在代码中的屏幕适配了
示例代码:
private void screenAdapter() {
// 登陆按钮占屏幕宽度的70%,输入框宽度与登陆按钮一样 int screenW = DensityUtils.getScreenW(this);
RelativeLayout.LayoutParams btnLoginParams = (LayoutParams) mBtnLogin
.getLayoutParams();
btnLoginParams.leftMargin = (int) ((screenW * 0.25) / 2);
btnLoginParams.rightMargin = (int) ((screenW * 0.25) / 2);
mBtnLogin.setLayoutParams(btnLoginParams);
mLayoutUid.measure(0, 0);
int layoutUidHeight = mLayoutUid.getMeasuredHeight();
// 头像在输入框正上方空白处居中 RelativeLayout.LayoutParams headImgParams = (LayoutParams) mImgHead
.getLayoutParams();
int screenH = DensityUtils.getScreenH(this);
headImgParams.height = (int) (screenH / 6.5);
headImgParams.width = headImgParams.height;
int headImgHeight = headImgParams.height;
// (屏幕的中心-27-输入框的高度-头像图片的高度)÷2 int inputTop = screenH / 2 - 27 - layoutUidHeight;
headImgParams.topMargin = (inputTop - headImgHeight) / 2;
mImgHead.setLayoutParams(headImgParams);
}