文档章节

android布局技巧之屏幕适配

爱看博客
 爱看博客
发布于 2015/10/22 10:02
字数 872
阅读 16
收藏 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
深圳

暂无文章

Nginx防盗链、访问控制、Nginx解析PHP相关配置、Nginx代理

Nginx防盗链 在配置文件里写入以下内容: 用curl测试 访问控制 Nginx限制某些IP不能访问或者只允许某些IP访问。 配置文件写入如下内容: allow 表示允许访问的IP,deny限制访问的IP。 匹配正...

黄昏残影
13分钟前
0
0
自己动手实现RPC服务调用框架

转载 TCP的RPC 引言 本文利用java自带的socket编程实现了一个简单的rpc调用框架,由两个工程组成分别名为battercake-provider(服务提供者)、battercake-consumer(服务调用者)。 设计思路...

雨中漫步的鱼
16分钟前
0
0
Centos6.x安装之后的9件事

Centos6.x安装之后的9件事 这些不是必须都做的,只不过是我个人的习惯,在此记录一下。 1.修改yum源到国内 CentOS系统更换软件安装源 备份你的原镜像文件,以免出错后可以恢复。 mv /etc/yu...

叶云轩
21分钟前
5
0
springboot2 使用jsp NoHandlerFoundException

开发图片上传功能,为验证测试功能是否正常,使用JSP编写表单提交进行测试 开发完成后,请求API提示如下异常: No mapping found for HTTP request with URI [/WEB-INF/jsp/avatar_upload.j...

showlike
27分钟前
0
0
springboot踩坑记--springboot正常启动但访问404

一 spring boot的启动类不能直接放在main(src.java.main)这个包下面,把它放在有包的里面就可以了。 二 正常启动了,但是我写了一个controller ,用的@RestController 注解去配置的controlle...

onedotdot
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部