位置: 编程技术 - 正文

Android 百分比布局库(percent-support-lib) 解析与扩展(怎样设置安卓等比例显示按钮)

编辑:rootadmin
&#;&#;androidsupportpercent

推荐整理分享Android 百分比布局库(percent-support-lib) 解析与扩展(怎样设置安卓等比例显示按钮),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:怎样设置安卓等比例显示按钮,android 百分比布局,android百分百布局,百分比手机,android 百分比布局,安卓百分百,安卓百分比,android百分比布局 弃用,内容如对您有帮助,希望把文章链接给更多的朋友!

目录(?)[&#;]

一概述二使用一PercentFrameLayout二 PercentRelativeLayout三源码分析一percent相关属性的获取二 onMeasue中重新计算child的尺寸三实现PercentLinearlayout一PercentLinearLayout二测试布局三效果图

转载请标明出处: 屏幕适配方案,这篇博客以Web页面设计引出一种适配方案,最终的目的就是可以通过百分比控制控件的大小。当然了,存在一些问题,比如:

对于没有考虑到屏幕尺寸,可能会出现意外的情况;apk的大小会增加;

当然了android-percent-support这个库,基本可以解决上述问题,是不是有点小激动,稍等,我们先描述下这个support-lib。

这个库提供了:

两种布局供大家使用: PercentRelativeLayout、PercentFrameLayout,通过名字就可以看出,这是继承自FrameLayout和RelativeLayout两个容器类;

支持的属性有:

layout_widthPercent、layout_heightPercent、 layout_marginPercent、layout_marginLeftPercent、 layout_marginTopPercent、layout_marginRightPercent、 layout_marginBottomPercent、layout_marginStartPercent、layout_marginEndPercent。

可以看到支持宽高,以及margin。

也就是说,大家只要在开发过程中使用PercentRelativeLayout、PercentFrameLayout替换FrameLayout、RelativeLayout即可。

是不是很简单,不过貌&#;没有LinearLayout,有人会说LinearLayout有weight属性呀。但是,weight属性只能支持一个方向呀~~哈,没事,刚好给我们一个机会去自定义一个PercentLinearLayout。

好了,本文分为3个部分:

PercentRelativeLayout、PercentFrameLayout的使用对上述控件源码分析自定义PercentLinearLayout二、使用

关于使用,其实及其简单,并且github上也有例子,android-percent-support-lib-sample。我们就简单过一下:

首先记得在build.gradle添加:

(一)PercentFrameLayout

3个TextView,很简单,直接看效果图:

(二) PercentRelativeLayout

ok,依然是直接看效果图:

使用没什么好说的,就是直观的看一下。

三、源码分析

其实细想一下,Google只是对我们原本熟悉的RelativeLayout和FrameLayout进行的功能的扩展,使其支持了percent相关的属性。

那么,我们考虑下,如果是我们添加这种扩展,我们会怎么做:

通过LayoutParams获取child设置的percent相关属性的&#;onMeasure的时候,将child的width,height的&#;,通过获取的自定义属性的&#;进行计算(eg:容器的宽 * fraction ),计算后传入给child.measure(w,h);

ok,有了上面的猜想,我们直接看PercentFrameLayout的源码。

代码是相当的短,可以看到PercentFrameLayout里面首先重写了generateLayoutParams方法,当然了,由于支持了一些新的layout_属性,那么肯定需要定义对应的LayoutParams。

(一)percent相关属性的获取

可以看到PercentFrameLayout.LayoutParams在原有的FrameLayout.LayoutParams基础上,实现了PercentLayoutHelper.PercentLayoutParams接口。

这个接口很简单,只有一个方法:

而,这个方法的实现呢,也只有一行:return mPercentLayoutInfo;,那么这个mPercentLayoutInfo在哪完成赋&#;呢?

看PercentFrameLayout.LayoutParams的构造方法:

可以看到,将attrs传入给getPercentLayoutInfo方法,那么不用说,这个方法的内部,肯定是获取自定义属性的&#;,然后将其封装到PercentLayoutInfo对象中,最后返回。

代码如下:

是不是和我们平时的取&#;很类&#;,所有的&#;最终封装到PercentLayoutInfo对象中。

ok,到此我们的属性获取就介绍完成,有了这些属性,是不是onMeasure里面要进行使用呢?

(二) onMeasue中重新计算child的尺寸Android 百分比布局库(percent-support-lib) 解析与扩展(怎样设置安卓等比例显示按钮)

可以看到onMeasure中的代码页很少,看来核心的代码都被封装在mHelper的方法中,我们直接看mHelper.adjustChildren方法。

通过注释也能看出,此方法中遍历所有的孩子,通过百分比的属性重新设置其宽度和高度。

首先在widthHint、heightHint保存容器的宽、高,然后遍历所有的孩子,判断其LayoutParams是否是PercentLayoutParams类型,如果是,通过params.getPercentLayoutInfo拿出info对象。

是否还记得,上面的分析中,PercentLayoutInfo保存了percent相关属性的&#;。

如果info不为null,则判断是否需要处理margin;我们直接看fillLayoutParams方法(处理margin也是类&#;的)。

首先保存原本的width和height,然后重置params的width和height为(int) (widthHint * widthPercent)和(int) (heightHint * heightPercent);。

到此,其实我们的百分比转换就结束了,理论上就已经实现了对于百分比的支持,不过Google还考虑了一些细节。

我们回到onMeasure方法:

下面还有个mHelper.handleMeasuredStateTooSmall的判断,也就是说,如果你设置的百分比,最终计算出来的MeasuredSize过小的话,会进行一些操作。代码如下:

首先遍历所有的孩子,拿出孩子的layoutparams,如果是PercentLayoutParams实例,则取出info。如果info不为null,调用shouldHandleMeasuredWidthTooSmall判断:

这里就是判断,如果你设置的measuredWidth或者measureHeight过小的话,并且你在布局文件中layout_w/h 设置的是WRAP_CONTENT的话,将params.width / height= ViewGroup.LayoutParams.WRAP_CONTENT,然后重新测量。

哈,onMeasure终于结束了~~~现在我觉得应该代码结束了吧,尺寸都设置好了,还需要干嘛么,but,你会发现onLayout也重写了,我们又不改变layout规则,在onLayout里面干什么毛线:

继续看mHelper.restoreOriginalParams

噗,原来是重新恢复原本的尺寸&#;,也就是说onMeasure里面的对&#;进行了改变,测量完成后。在这个地方,将&#;又恢复成如果布局文件中的&#;,上面写的都是0。恢复很简单:

你应该没有忘在哪存的把~忘了的话,麻烦Ctrl&#;F ‘mPreservedParams.width’ 。

也就是说,你去打印上面写法,布局文件中view的v.getLayoutParams().width,这个&#;应该是0。

这里感觉略微不爽~这个0没撒用处呀,还不如不重置~~

好了,到此就分析完了,其实主要就几个步骤:

LayoutParams中属性的获取onMeasure中,改变params.width为百分比计算结果,测量如果测量&#;过小且设置的w/h是wrap_content,重新测量onLayout中,重置params.w/h为布局文件中编写的&#;

可以看到,有了RelativeLayout、FrameLayout的扩展,竟然没有LinearLayout几个意思。好在,我们的核心代码都由PercentLayoutHelper封装了,自己扩展下LinearLayout也不复杂。

三、实现PercentLinearlayout

可能有人会说,有了weight呀,但是weight能做到宽、高同时百分比赋&#;嘛?

好了,代码很简单,如下:

(一)PercentLinearLayout

如果你详细看了上面的源码分析,这个代码是不是没撒解释的了~

(二)测试布局

我们纵向排列的几个TextView,分别设置宽/高都为百分比,且之间的间隔为5%p。

(三)效果图

ok,到此,我们使用、源码分析、扩展PercentLinearLayout就结束了。

添加PercentLinearLayout后的地址:点击查看

扩展下载:android-percent-support-extend 包含android studio, eclipse项目,以及上述源码。

~~have a nice day ~~

新浪微博

群号:

微信公众号:hongyangAndroid (欢迎关注,第一时间推送博文信息)

Framework-res.apk内容简介 摘自:

Android中的颜色使用 十六进制颜色表达中,我现在只记得#FFFFFF是白色,#是黑色,这里再进行一点拓展。有时候,我们定义了一个TextView,然后想在java文件中动态控制它

uil的简单常用操作 转:点击打开链接如果说评价一下哪个图片开源库最被广泛使用的话,我想应该可以说是Universal-Image-Loader,在主流的应用中如果你随便去反编译几个,

标签: 怎样设置安卓等比例显示按钮

本文链接地址:https://www.jiuchutong.com/biancheng/379590.html 转载请保留说明!

上一篇:Android Studio 右侧条标高亮显示选中的相同变量,类,方法。。。(android studio右边的视图不见了)

下一篇:Framework-res.apk内容简介(framework res.apk)

  • 化肥与农药的利与弊
  • 手工现金日记账怎么转下一页
  • 支付职工的培训费计入什么科目
  • 新公司成立后税务方面要做的事情有哪些
  • 费用发票跨月可以入帐吗
  • 存在商业折扣的情况下,应收账款按什么金额入账?
  • 名义股东转让股份侵权
  • 多开的增值税发票交多少税
  • 资产损失税前扣除管理办法2019
  • 递延收益是什么表
  • 公司账户没有钱怎么办
  • 复利现值系数和普通年金现值系数关系
  • 促销赠品的会计处理
  • 总资产现金回收率是什么与什么平均余额的比
  • 营改增的案例分析
  • 监控维护需要什么经营范围
  • 反写状态已反写是什么意思
  • 普通股资本成本计算方法
  • 火车票抵扣进项税需要认证吗
  • 借款本金和借款余额
  • 建筑企业法定代表人和建筑公司资质不是一个人
  • 收到境外公司服务费
  • 融资租赁哪些项目可以增值税抵扣
  • 企业偷税行为
  • 验资报告需要什么材料
  • 跨年的发票可以补开吗
  • 免税农产品抵扣政策
  • 合并报表中营业利润不等于
  • 社保公积金外包对员工的利弊
  • windows11如何
  • 应收账款贷方余额重分类到哪
  • 五险一金的记账凭证怎么填写
  • windows10无线网卡怎么连接无线网
  • 总资产净利率和权益乘数之间的关系
  • 默认网关不可用频繁掉线
  • 电脑出现一堆英文无法开机
  • WordPress置顶文章的相关PHP函数小结
  • 房地产企业前期工程费包括什么项目
  • 小米路由器599元
  • 增值税退税是否属于政府补助
  • element ui
  • 自注意力机制是什么
  • jedis命令
  • php array_merge_recursive 数组合并
  • 企业银行电子回单一般什么时候打印
  • 承兑汇票兑现与贴现的区别
  • 兼职人员的工资怎么做账
  • 提取法定盈余公积的公式
  • mac安装步骤
  • 免费开源okr管理系统
  • 电子承兑汇票贴现怎么操作
  • 对公户单笔转账有限额吗
  • 购货销售折让会计分录
  • 对公账户怎么查询开户行
  • 长期股权投资收益要交企业所得税吗
  • 票据的收款人和持票人有什么区别
  • 财政补贴收入怎么做账
  • 公司支付款项制度
  • 政府扶持国有企业
  • 企业之间利息收入开票吗
  • 民间非营利组织会计制度及操作实务
  • 单位人民币卡账户的资金一律从其基本存款账户转账存入
  • 捐赠固定资产怎么入账
  • 对方多开票怎么处理
  • 当月已经认证的发票可以取消认证吗
  • 公司报销给个人的会计分录
  • 公用事业费属于什么会计科目
  • mysql启动时找不到mysqld.server
  • win7系统屏幕键盘怎么打开
  • WIN10系统中没有接入音频设备 要启动gui
  • linux wc命令详解
  • win8.1玩游戏好不好
  • quick cocos UIListView之isItemInViewRect方法修正
  • 狗刨教学视频新手入门
  • angularjs2
  • python爬虫介绍
  • javascript入门基础
  • unity引擎占用内存多少
  • js和jquery混合使用
  • 十大经济
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设