前言
由于最近在寫一個涉及移動方面的自定義View,在做移動的時候用到了類似offsetTopAndBottom 、setTranslationY、scrollTo、scrollBy等方法,對于他們的使用,有一些不太清晰的地方。比如,view的getX/Y、getSrollX/Y、getTranslationX/Y、getLeft/top/right/bottom、點擊事件觸發區域等等 是否會受到影響改變,由哪些所影響。
因為View的屬性有點多,所以,很多時候你不知道哪些屬性受哪些方法影響,并且多種方法聯合使用的時候,效果又是如何,影響又是如何。
正題
于是我就開始測試,實踐來檢驗結果。
目前為止大致有這幾種方法可以移動view:
**1、setTranslationX/Y
2、scrollTo/scrollBy
3、offsetTopAndBottom/offsetLeftAndRight
4、平移動畫
5、設置margin
**
主要是驗證一些屬性:
1、getX()、getY()
2、getScrollX() 、getScrollY()
3、getTranslationX() 、getTranslationY()
4、getLeft()、 getTop()、 getRight()、 getBottom()(坐標位置是否改變)
5、點擊事件觸發區域是否改變
6、是否會影響同層級的其他view的位置
7、超過父View是否繪制
現在主要把他們用一張表列出來:
稍微整理一下他們各自特點:
setTranslationX/Y
- getX getY 會變
- getTranslationXY會變
- 點擊事件的位置也變了但是不會超過父布局
- 會超過邊界到同級View的區域去(被覆蓋或者覆蓋別人)
- 這個方法的底層實現主要是通過metrix矩陣變換來的,坐標位置沒有改變(跟offset不同,它是通過坐標位置改變)
scrollTo/scrollBy
- getScrollXY 會變
- 點擊事件還是在原位置 (跟動畫類似)
- 但是內容區域變了(如果超出自己的區域 就顯示不出來)
- 它只是內容區域的移動,本身view是不移動的
- scrollBy的x y 是相對移動的值
- scrollTo的x y 是絕對移動的值
offsetTopAndBottom/offsetLeftAndRight
- 上下左右坐標會變 (主要是通過坐標位置的改變產生移動效果)
- getXY會變
- 點擊事件的位置也變了
- 會超過邊界到別人的區域去(被覆蓋或者覆蓋別人)
- 它的offY是相對移動的值
平移動畫
- 點擊事件還是在原位置
- 如果setFillAfter位置保留 但是其他任何坐標位置沒有改變 再次點擊從原位置重新開始移動
設置margin
- 如果父View為wrap的話,設置margin可以移動,但是可能會對同級view造成影響(比如在linear中或者relative中有關聯關系)
下面是驗證過程:(前方高能,多圖預警!!!!!最重要的東西都羅列在前面了,沒時間不用往下看了)
setTranslationXY:
- getX getY 會變
- getTranslationXY會變
- 點擊事件的位置也變了但是不會超過父布局
- 會超過邊界到同層view的區域去(被覆蓋或者覆蓋別人--取決于先后順序)
scrollBy:
offsetTopAndBottom offsetLeftAndRight:
動畫+setFillAfter(true):
margin:
組合
比如先多點幾次 offset ,然后再margin會立馬回到(原位置+margin)后的狀態
說明:margin的平移效果是以view在父View中的位置和margin值決定的,是父View通過計算margin值之后,重新給你排的位置,實現的移動。當我們設置margin之后,會觸發requestLayout,所以父VIew又重新給它排了位置。
如果,我先offset幾次,然后再點擊動畫,動畫會在原來的基礎上,繼續平移。
說明:動畫不是根據位置來移動的,可能是根據一個metrix的矩陣變換來實現平移的(請指正)
如果,先scrollBy,然后再動畫、offset和其他移動方法,
說明:其他的平移方法,都是對于view本身在做移動,而不像scrollBy只是對其內容進行平移
總結
好了,差多就這些了,其他更多復雜的組合使用,只要你能逐一弄清楚他們各自起作用的屬性和對象,你就能大致摸索出來。
剩下的大家可以去demo看看,然后自己試一試。