详解安卓Gravity的进制封装

前言

安卓中的部分控件中有一个setGravity的方法,可以使用它设置View内重力的方向。

以LinearLayout为例,它的使用是这样的

LinearLayout linearlayout=findViewById(R.id.xxx);
linearlayout.setGravity(Gravity.Top|Gravity.Center|Gravity.Start);//添加重力

这样的代码,通过符号"|"设置多种重力仅需要一次set,阅读起来十分简洁。

那它是怎么做到的呢?

准备

代码分析需要一定的进制操作符基础,我们先简单复习一下java关于进制的运算符

声明:以下均是对2进制的操作

定义A=0011_1100

定义B=0000_1101

操作符 描述 例子
& 如果都是1,则为1,否则0 A&B=0000_1100
| 如果都是0,则为0,否则1 A|B=0011_1101
^ 如果值相同,则为0,否则1 A^B=0011_0001
~ 如果是0,则变1.如果是1,则变0 ~A=1100_0011
<< 向左移动,用0补齐 A<<2=1111_0000
>> 向右移动 A>>2=1111
>>> 向右移动,用0补齐 A>>>2=0000_1111

代码分析

复习好了进制运算符,我们来看一下代码

按下Ctrl+左键,单击进入setGravity方法可以看到如下代码

  public void setGravity(int gravity) {if (mGravity != gravity) {if ((gravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) == 0) {gravity |= Gravity.START;}if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == 0) {gravity |= Gravity.TOP;}mGravity = gravity;//去除了部分无关代码}}

可以确定mGravity是LinearLayout的重力储存变量

我们再来分析一下这两个if是干什么的。按下Ctrl+左键,跟进Gravity

内部定义的常量如下

//去除了部分无关代码
public static final int AXIS_SPECIFIED = 0x0001;//1
public static final int AXIS_PULL_BEFORE = 0x0002;//10
public static final int AXIS_PULL_AFTER = 0x0004;//100
public static final int AXIS_X_SHIFT = 0;
public static final int AXIS_Y_SHIFT = 4;
public static final int TOP = (AXIS_PULL_BEFORE|AXIS_SPECIFIED)<<AXIS_Y_SHIFT;//110000
public static final int BOTTOM = (AXIS_PULL_AFTER|AXIS_SPECIFIED)<<AXIS_Y_SHIFT;//1010000
public static final int LEFT = (AXIS_PULL_BEFORE|AXIS_SPECIFIED)<<AXIS_X_SHIFT;//11
public static final int RIGHT = (AXIS_PULL_AFTER|AXIS_SPECIFIED)<<AXIS_X_SHIFT;//101
public static final int RELATIVE_LAYOUT_DIRECTION = 0x00800000;//100000000000000000000000
public static final int START = RELATIVE_LAYOUT_DIRECTION | LEFT;
//100000000000000000000011
public static final int END = RELATIVE_LAYOUT_DIRECTION | RIGHT;
//100000000000000000000101
public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = START | END;
//100000000000000000000111
//为了方便阅读我将这些常量的二进制写在了注释

观察代码

TOPBOTTOM都是左偏移4位的值,而LEFTRIGHT都是左偏移0位的值

再根据变量名称,可以确定 将Gravity从后向前看,前四位控制的是与X轴有关的重力,四位以后控制的是与Y轴有关的重力

STARTEndLEFTRIGHT补位后的值

RELATIVE_HORIZONTAL_GRAVITY_MASKSTART|END

回过来再看刚才的if

if ((gravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) == 0) {gravity |= Gravity.START;}

很明显,这个if是判断传入的gravity是否具有LEFT或者RIGHT的重力方向,也就是X轴的重力方向

如果不具备X轴的重力,则添加START

第2个if则是判断是否具备Y轴的重力

至此,setGravity就分析完成了

那怎么判断传入的gravity是否具有某一方向的重力呢

if(gravity&BOTTOM^BOTTOM==0){//有
}

总结

对于多类型参数传参操作,可以使用进制封装进行大幅度简化

我们只需要定义每一位的作用,并遵循一个规则

1为有0为没有|添加^如果没有就添加,如果有就去除&判断是否有

详解安卓Gravity的进制封装相关推荐

  1. 15从零开始学Java之详解计算机中的进制转换

    作者:孙玉昌,昵称[一一哥],另外[壹壹哥]也是我哦 CSDN博客专家.万粉博主.阿里云专家博主.掘金优质作者 配套项目资料 https://github.com/SunLtd/LearnJava h ...

  2. 详解安卓应用性能测试方法以及Android SDK中辅助测试的工具使用

    Android前端APP的性能测试一般针对以下几个方面:应用启动时间:CPU的占用:内存的占用:流量的耗用:电量的耗用:流畅度等.一般对App进行性能测试都需要借助不同的工具完成,本章节会向读者重点介 ...

  3. android8.0的蓝牙版本,android o 新特性详解 安卓8.0蓝牙音频增强以及更加可爱的表情包...

    android 8.0什么时候推出?有哪些新特色?很多安卓用户非常想知道答案吧!不用着急,下面是大麦子小编整理出来的安卓8.0新特性详解,希望可以帮到大家. 有媒体近日曝光了有关谷歌Pixel XL ...

  4. 关于Android安卓APP保活 - 安卓消息推送详解 - 安卓端外推送离线推送

    转自:http://zhangtielei.com/posts/blog-android-push.html 说Android端外推送比较烦,实际有两层意思:首先是说实现上比较麻烦,至今业界也没有找到 ...

  5. FFmpeg入门详解之19:音视频封装原理简介

    什么是数据封装和解封装? 数据封装(baiData Encapsulation),笼统地讲,就是把业务数据映射到du某个封装协议zhi的净dao荷中,然后填充对应协议的包头,形成封装协议的数据包,并完 ...

  6. 标注所有线段的lisp程序源码_仪表进近图剖面图的详解(五)进近程序高度限制...

    1.剖面图上应标注中间进近航段和最后进近航段内的高度限制,包括IF.FAF.SDF 及高度检查点的高度限制. 2.当进近程序采用过渡高度(TA)时,高度限制应公布海压高度和场压高两个数值,场压高为海压 ...

  7. android配置参数详解,安卓手机CPU与GPU等配置参数含义详解【详细介绍】

    我们在关注一些手机配置信息的时候,很多手机配置表上常常会标识CPU,GPU,RAM,ROM以及GSM,WCDMA等一系列英文配置参数的数据,而这一些相似的英文配置都代表了什么意思呢?关于这个问题,一起 ...

  8. 安卓编译android.mk,详解安卓系统中的Android.mk文件

    概述    Android.mk文件用来向编译系统描述如何编译你的源代码.更确切地说,该文件其实就是一个小型的Makefile.由于该文件会被NDK的编译工具解析多次,因此应该尽量减少源码中声明变量, ...

  9. 面向对象(详解):三大特征【封装性、继承性、多态性】

    目录 封装性 封装性的设计思想 Java规定的四种权限修饰符  继承性 继承性的好处 类继承语法规则 子类继承父类以后的特点 多态性(重要) 引用变量的两个类型 编译时类型 运行时类型 多态的应用举例 ...

最新文章

  1. 播客#47:劳伦斯·布拉德福德
  2. golang中的strings.SplitN
  3. 在上位计算机控制时不能将s7-200,plc控制系统编程题库.doc
  4. 字体--Ubuntu手记之系统配置
  5. python循环语句嵌套_Python 循环语句
  6. NAU8810相关问题
  7. 【PAT】2020年春季考试乙级题目、答案、摸鱼、游记、93分
  8. Skyline Web 二次开发- 1.地图显示、Position、AttachEvent
  9. 解决office 2013 新建PPT(幻灯片)为拉伸矩形问题
  10. 易基因|典型案例:MeRIP-seq综合分析肺腺癌中的转录组m6A甲基化组
  11. C/C++中各类数值型数据间的混合运算法则
  12. Hurst指数估计方法(时域)——DFA
  13. 红蓝对抗——蓝军(CheckList)总结
  14. 爬虫之抽屉新热榜点赞基本示例
  15. dw html段落首行缩进,使用Dreamweaver8实现文本首行缩进
  16. LeetCode,无它,唯手熟尔(四)
  17. 【光线追踪系列十四】蒙特卡洛积分与重要性采样
  18. 如何创建 ESXi 安装程序 USB 闪存驱动器
  19. HTML 版本声明 DOCTYPE 标签
  20. 准确率上升,损失loss也上升

热门文章

  1. 【Android】【UI】ACTION_CANCEL什么时候执行
  2. 芯洲SCT2230TVBR为用户小型化设计提供了简洁的电源解决方案
  3. 【英文美方阅读】之《The falling of the leaves》——《叶落》
  4. ZJNU——1259:幸运数字(找规律题)
  5. 知识付费存在的问题及未来的发展
  6. 仿视频字幕弹幕网站Miko二次元动漫视频网站源码
  7. 诺贝尔奖得主罗伯特·莫顿—唯有信任,方得科技创新
  8. 毅力号火星漫游机器人成功着陆开启远古生命起源探索
  9. 我认为接口存在的意义
  10. JAVA中接口存在的意义