详解安卓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的进制封装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jmeter逻辑控制器之while循环控
- 下一篇: 虚拟仿真 人人开发(二)