详解安卓Gravity的进制封装
详解安卓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
//为了方便阅读我将这些常量的二进制写在了注释
观察代码
TOP
和BOTTOM
都是左偏移4位的值,而LEFT
和RIGHT
都是左偏移0位的值
再根据变量名称,可以确定 将Gravity从后向前看,前四位控制的是与X轴有关的重力,四位以后控制的是与Y轴有关的重力
而START
和End
是LEFT
和RIGHT
补位后的值
RELATIVE_HORIZONTAL_GRAVITY_MASK
是START|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的进制封装相关推荐
- 15从零开始学Java之详解计算机中的进制转换
作者:孙玉昌,昵称[一一哥],另外[壹壹哥]也是我哦 CSDN博客专家.万粉博主.阿里云专家博主.掘金优质作者 配套项目资料 https://github.com/SunLtd/LearnJava h ...
- 详解安卓应用性能测试方法以及Android SDK中辅助测试的工具使用
Android前端APP的性能测试一般针对以下几个方面:应用启动时间:CPU的占用:内存的占用:流量的耗用:电量的耗用:流畅度等.一般对App进行性能测试都需要借助不同的工具完成,本章节会向读者重点介 ...
- android8.0的蓝牙版本,android o 新特性详解 安卓8.0蓝牙音频增强以及更加可爱的表情包...
android 8.0什么时候推出?有哪些新特色?很多安卓用户非常想知道答案吧!不用着急,下面是大麦子小编整理出来的安卓8.0新特性详解,希望可以帮到大家. 有媒体近日曝光了有关谷歌Pixel XL ...
- 关于Android安卓APP保活 - 安卓消息推送详解 - 安卓端外推送离线推送
转自:http://zhangtielei.com/posts/blog-android-push.html 说Android端外推送比较烦,实际有两层意思:首先是说实现上比较麻烦,至今业界也没有找到 ...
- FFmpeg入门详解之19:音视频封装原理简介
什么是数据封装和解封装? 数据封装(baiData Encapsulation),笼统地讲,就是把业务数据映射到du某个封装协议zhi的净dao荷中,然后填充对应协议的包头,形成封装协议的数据包,并完 ...
- 标注所有线段的lisp程序源码_仪表进近图剖面图的详解(五)进近程序高度限制...
1.剖面图上应标注中间进近航段和最后进近航段内的高度限制,包括IF.FAF.SDF 及高度检查点的高度限制. 2.当进近程序采用过渡高度(TA)时,高度限制应公布海压高度和场压高两个数值,场压高为海压 ...
- android配置参数详解,安卓手机CPU与GPU等配置参数含义详解【详细介绍】
我们在关注一些手机配置信息的时候,很多手机配置表上常常会标识CPU,GPU,RAM,ROM以及GSM,WCDMA等一系列英文配置参数的数据,而这一些相似的英文配置都代表了什么意思呢?关于这个问题,一起 ...
- 安卓编译android.mk,详解安卓系统中的Android.mk文件
概述 Android.mk文件用来向编译系统描述如何编译你的源代码.更确切地说,该文件其实就是一个小型的Makefile.由于该文件会被NDK的编译工具解析多次,因此应该尽量减少源码中声明变量, ...
- 面向对象(详解):三大特征【封装性、继承性、多态性】
目录 封装性 封装性的设计思想 Java规定的四种权限修饰符 继承性 继承性的好处 类继承语法规则 子类继承父类以后的特点 多态性(重要) 引用变量的两个类型 编译时类型 运行时类型 多态的应用举例 ...
最新文章
- 播客#47:劳伦斯·布拉德福德
- golang中的strings.SplitN
- 在上位计算机控制时不能将s7-200,plc控制系统编程题库.doc
- 字体--Ubuntu手记之系统配置
- python循环语句嵌套_Python 循环语句
- NAU8810相关问题
- 【PAT】2020年春季考试乙级题目、答案、摸鱼、游记、93分
- Skyline Web 二次开发- 1.地图显示、Position、AttachEvent
- 解决office 2013 新建PPT(幻灯片)为拉伸矩形问题
- 易基因|典型案例:MeRIP-seq综合分析肺腺癌中的转录组m6A甲基化组
- C/C++中各类数值型数据间的混合运算法则
- Hurst指数估计方法(时域)——DFA
- 红蓝对抗——蓝军(CheckList)总结
- 爬虫之抽屉新热榜点赞基本示例
- dw html段落首行缩进,使用Dreamweaver8实现文本首行缩进
- LeetCode,无它,唯手熟尔(四)
- 【光线追踪系列十四】蒙特卡洛积分与重要性采样
- 如何创建 ESXi 安装程序 USB 闪存驱动器
- HTML 版本声明 DOCTYPE 标签
- 准确率上升,损失loss也上升