笔记6 | 从源码理解分析mScrollX和mScrollY,scrollTo()和scrollBy(),smoothScrollTo和smoothScrollBy...
前言
我想開頭先說說
a.度娘一下什么都知道了,整理這些東西有什么用?還費(fèi)時(shí)費(fèi)力的!如何才能完全掌握一個(gè)知識(shí)?當(dāng)你能把它講清楚的時(shí)候,你才算掌握了他。
想完全把mScrollX和mScrollY,scrollTo()和scrollBy(),smoothScrollTo和smoothScrollBy弄明白并不容易,但查閱他們的源代碼基本就能明白個(gè)大概,這篇文章就是從源碼分析他們究竟有什么作用和區(qū)別,讀懂了基本就會(huì)用!
公眾號(hào)
目錄
- mScrollX和mScrollY
- scrollTo()和scrollBy()
- smoothScrollBy和smoothScrollTo
- view和viewgroup
一.mScrollX和mScrollY
直接翻譯就可以得知
mScrollX:表示離視圖起始位置的x水平方向的偏移量
mScrollY:表示離視圖起始位置的y垂直方向的偏移量
通過getScrollX() 和getScrollY()方法獲這兄弟倆。注意:mScrollX和mScrollY指的并不是坐標(biāo),而是偏移量。
二.scrollTo()和scrollBy()
源碼可以看出,scrollTo 和 scrollBy區(qū)別,其實(shí)2者的效果是一樣的,只是過程不同而已。
scrollTo(int x,int y):
如果偏移位置發(fā)生了改變,就會(huì)給mScrollX和mScrollY賦新值,改變當(dāng)前位置。注意:x,y代表的不是坐標(biāo)點(diǎn),而是偏移量。例如:我要移動(dòng)view到坐標(biāo)點(diǎn)(100,100),那么我的偏移量就是(0,,0) - (100,100) = (-100 ,-100) ,我就要執(zhí)行view.scrollTo(-100,-100),達(dá)到這個(gè)效果。
scrollBy(int x,int y):
從源碼中看出,它實(shí)際上是調(diào)用了scrollTo(mScrollX + x, mScrollY + y);mScrollX + x和mScrollY + y,即表示在原先偏移的基礎(chǔ)上在發(fā)生偏移,通俗的說就是相對(duì)我們當(dāng)前位置偏移。根據(jù)父類VIEW里面移動(dòng),如果移動(dòng)到了超出的地方,就不會(huì)顯示。
三.smoothScrollTo和smoothScrollBy
ScrollView.smoothScrollBy和smoothScrollTo的源碼
源碼可以看出,是ScrollBy和ScrollTo增加滾動(dòng)動(dòng)畫的升級(jí)方案;
moothScrollBy(int dx, int dy) :
?dy = Math.max(0, Math.min(scrollY + dy, maxY)) - scrollY;為方法的核心,比較繞,大致為計(jì)算當(dāng)前滑動(dòng)狀態(tài)下可劃動(dòng)距離;
if(duration > ANIMATEDSCROLLGAP) 這句是判斷當(dāng)前是否在滾動(dòng),當(dāng)還在滾動(dòng)狀態(tài)下,執(zhí)行mScroller.startScroll(mScrollX, scrollY, 0, dy);當(dāng)不在滾動(dòng),就立馬打斷。
smoothScrollTo(int x, int y):
?它實(shí)際上是調(diào)用了smoothScrollBy(x - mScrollX, y - mScrollY);方法根據(jù)x,y的值來計(jì)算剩余可滾動(dòng)的位移量;
四.view和viewgroup
最后講講view和viewgroup這倆,完全吃透有點(diǎn)難,通俗講,Android的UI界面都是由View和ViewGroup及其派生類組合而成的,View是所有UI組件的基類,而ViewGroup是容納這些組件的容器;View類是ViewGroup的父類,ViewGroup具有View的所有特性,ViewGroup主要用來充當(dāng)View的容器,將其中的View作為自己孩子,并對(duì)其進(jìn)行管理,當(dāng)然孩子也可以是ViewGroup類型。
View派生出的直接子類有:AnalogClock,ImageView,KeyboardView, ProgressBar,SurfaceView,TextView,ViewGroup,ViewStubView派生出的間接子類有:AbsListView,AbsSeekBar, AbsSpinner, AbsoluteLayout, AdapterView,AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView, AutoCompleteTextView,Button,CalendarView, CheckBox, CheckedTextView, Chronometer, CompoundButton
ViewGroup派生出的直接子類有:AbsoluteLayout,AdapterView,FragmentBreadCrumbs,FrameLayout,LinearLayout,RelativeLayout,SlidingDrawer;
ViewGroup派生出的間接子類有:AbsListView,AbsSpinner, AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView, CalendarView, DatePicker, DialerFilter, ExpandableListView, Gallery, GestureOverlayView,GridView,HorizontalScrollView, ImageSwitcher,ListView,
當(dāng)然,隨著Android版本不斷地更新,這些派生出來的子類也是在不段增加的!
END
轉(zhuǎn)載于:https://www.cnblogs.com/xiangevan/p/7818150.html
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的笔记6 | 从源码理解分析mScrollX和mScrollY,scrollTo()和scrollBy(),smoothScrollTo和smoothScrollBy...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随笔② Java中的关键字 --- fi
- 下一篇: Got error -1 when re