文档章节

android布局技巧之屏幕适配

爱看博客
 爱看博客
发布于 2015/10/22 10:02
字数 872
阅读 15
收藏 0
点赞 0
评论 0

本文主要讲解android开发中:如何在代码中做到屏幕适配

在做android应用开发的时候,遇到最头疼的问题之一大概就是屏幕适配了,那么除了常用的使用不同分辨率的layout布局文件外,有没有更方便的办法呢?答案是肯定的。

首先看图片,一个简单的登录界面(ps:这万恶的红薯,居然只能用flash上传图片)


这个登录界面的布局比较简单大家一看就明白了两个TextView和EditView的嵌套组合成的输入框。

那么,我要说的问题是:在480*800的屏幕上,我们看到的是输入框占全屏宽度(设置了边距但宽度仍是占满父控件)到了800*1600、600*1200(我瞎编的分辨率,大家别见怪)换了一个大屏幕的手机,难道还是铺满父控件吗,一个长度是头像几十倍的账号密码输入框显然是不美观的。

更多的解决办法是在项目中建立不同分辨率的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);
    }





版权声明:本文原创,转载请注明来自 http://kymjs.com/

本文转载自:http://blog.csdn.net/kymjs/article/details/40677291

共有 人打赏支持
爱看博客
粉丝 5
博文 103
码字总数 23887
作品 0
深圳

暂无相关文章

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 52分钟前 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 今天 ⋅ 0

如何将S/4HANA系统存储的图片文件用Java程序保存到本地

我在S/4HANA的事务码MM02里为Material维护图片文件作为附件: 通过如下简单的ABAP代码即可将图片文件的二进制内容读取出来: REPORT zgos_api.DATA ls_appl_object TYPE gos_s_obj.DA...

JerryWang_SAP ⋅ 今天 ⋅ 0

云计算的选择悖论如何对待?

导读 人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云...

问题终结者 ⋅ 今天 ⋅ 0

637. Average of Levels in Binary Tree - LeetCode

Question 637. Average of Levels in Binary Tree Solution 思路:定义一个map,层数作为key,value保存每层的元素个数和所有元素的和,遍历这个树,把map里面填值,遍历结束后,再遍历这个map,把每...

yysue ⋅ 今天 ⋅ 0

IDEA配置和使用

版本控制 svn IDEA版本控制工具不能使用 VCS-->Enable Version Control Integration File-->Settings-->Plugins 搜索Subversion,勾选SVN和Git插件 删除.idea文件夹重新生成项目 安装SVN客户......

bithup ⋅ 今天 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部