10分鐘詳細(xì)解讀android scrollview
結(jié)構(gòu)
繼承關(guān)系
public class ScrollView extends FrameLayout
java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.FrameLayout
android.widget.ScrollView
類概述
一種可供用戶滾動(dòng)的層次結(jié)構(gòu)布局容器,允許顯示比實(shí)際多的內(nèi)容。ScrollView是一種FrameLayout,意味需要在其上放置有自己滾動(dòng)內(nèi)容的子元素。子元素可以是一個(gè)復(fù)雜的對(duì)象的布局管理器。通常用的子元素是垂直方向的LinearLayout,顯示在最上層的垂直方向可以讓用戶滾動(dòng)的箭頭。
TextView類也有自己的滾動(dòng)功能,所以不需要使用ScrollView,但是只有兩個(gè)結(jié)合使用,才能保證顯示較多內(nèi)容時(shí)候的效率。但只有兩者結(jié)合使用才可以實(shí)現(xiàn)在一個(gè)較大的容器中一個(gè)文本視圖效果。
ScrollView只支持垂直方向的滾動(dòng)。
構(gòu)造函數(shù)
public ScrollView (Context context)
創(chuàng)建一個(gè)默認(rèn)屬性的ScrollView實(shí)例。
public ScrollView (Context context, AttributeSet attrs)
創(chuàng)建一個(gè)帶有attrs屬性的ScrollView 實(shí)例。
public ScrollView (Context context, AttributeSet attrs, int defStyle)
創(chuàng)建一個(gè)帶有attrs屬性,并且指定其默認(rèn)樣式的ScrollView實(shí)例。
公共方法
public void addView (View child)
添加子視圖。如果事先沒(méi)有給子視圖設(shè)置layout參數(shù),會(huì)采用當(dāng)前ViewGroup的默認(rèn)參數(shù)來(lái)設(shè)置子視圖。
參數(shù)
child 所添加的子視圖
public void addView (View child, int index)
添加子視圖。如果事先沒(méi)有給子視圖設(shè)置layout參數(shù),會(huì)采用當(dāng)前ViewGroup的默認(rèn)參數(shù)來(lái)設(shè)置子視圖。
參數(shù)
child 所添加的子視圖
index 添加子視圖的位置
public void addView (View child, int index, ViewGroup.LayoutParams params)
根據(jù)指定的layout參數(shù)添加子視圖
參數(shù)
child 所添加的子視圖
index 添加子視圖的位置
params 為子視圖設(shè)置的layout參數(shù)
public void addView (View child, ViewGroup.LayoutParams params)
根據(jù)指定的layout參數(shù)添加子視圖。
參數(shù)
child 所添加的子視圖
params 為子視圖設(shè)置的layout參數(shù)
public boolean arrowScroll (int direction)
響應(yīng)點(diǎn)擊上下箭頭時(shí)對(duì)滾動(dòng)條滾動(dòng)的處理。
參數(shù)
direction 按下的箭頭所對(duì)應(yīng)的方向
返回值
如果我們處理(消耗)了此事件返回true,否則返回false。
public void computeScroll ()
被父視圖調(diào)用,用于必要時(shí)候?qū)ζ渥右晥D的值(mScrollX和mScrollY)進(jìn)行更新。典型的情況如:父視圖中某個(gè)子視圖使用一個(gè)Scroller對(duì)象來(lái)實(shí)現(xiàn)滾動(dòng)操作,會(huì)使得此方法被調(diào)用。
public boolean dispatchKeyEvent (KeyEvent event)
發(fā)送一個(gè)key事件給當(dāng)前焦點(diǎn)路徑的下一個(gè)視圖。此焦點(diǎn)路徑從視圖樹(shù)的頂層執(zhí)行直到當(dāng)前焦點(diǎn)視圖。如果此視圖為焦點(diǎn)視圖,將為自己發(fā)送。否則,會(huì)為當(dāng)前焦點(diǎn)路徑的下一個(gè)節(jié)點(diǎn)發(fā)送。此方法也會(huì)激起一個(gè)key監(jiān)聽(tīng)器。
參數(shù)
event 發(fā)送的key事件
返回值
事件被處理返回true,否則返回false。
public void draw (Canvas canvas)
手動(dòng)繪制視圖(及其子視圖)到指定的畫布(Canvas)。這個(gè)視圖必須在調(diào)用這個(gè)函數(shù)之前做好了整體布局。當(dāng)實(shí)現(xiàn)一個(gè)視圖時(shí),不需要繼承這個(gè)方法;相反,你應(yīng)該實(shí)現(xiàn)onDraw(Canvas)方法。
參數(shù)
canvas 繪制視圖的畫布
public boolean executeKeyEvent (KeyEvent event)
當(dāng)接收到key事件時(shí),用戶可以調(diào)用此函數(shù)來(lái)使?jié)L動(dòng)視圖執(zhí)行滾動(dòng),類似于處理由視圖體系發(fā)送的事件。
參數(shù)
event 需要執(zhí)行key的事件
返回值
事件被處理返回true,否則返回false。
public void fling (int velocityY)
滾動(dòng)視圖的滑動(dòng)(fling)手勢(shì)。(譯者注: 如何監(jiān)聽(tīng)android的屏幕滑動(dòng)停止事件)
參數(shù)
velocityY Y方向的初始速率。正值表示手指/光標(biāo)向屏幕下方滑動(dòng),而內(nèi)容將向上滾動(dòng)。
public boolean fullScroll (int direction)
對(duì)響應(yīng)“home/end”短按時(shí)響應(yīng)滾動(dòng)處理。此方法將視圖滾動(dòng)到頂部或者底部,并且將焦點(diǎn)置于新的可視區(qū)域的最頂部/***部組件。若沒(méi)有適合的組件做焦點(diǎn),當(dāng)前的ScrollView會(huì)收回焦點(diǎn)。
參數(shù)
direction 滾動(dòng)方向:FOCUS_UP表示視圖向上滾動(dòng);FOCUS_DOWN表示視圖向下滾動(dòng)
返回值
若key事件被消耗(consumed)返回true,其他情況返回false。
public int getMaxScrollAmount ()
返回值
當(dāng)前滾動(dòng)視圖響應(yīng)箭頭事件能夠滾動(dòng)的***數(shù)。
public boolean isFillViewport ()
指示當(dāng)前ScrollView的內(nèi)容是否被拉伸以填充視圖可視范圍(譯者注:viewport可視范圍,參見(jiàn)決定Scrollviewer里面Control的可視范圍)。
返回值
內(nèi)容填充視圖返回true,否則返回false。
public boolean isSmoothScrollingEnabled ()
返回值
按箭頭方向滾動(dòng)時(shí),是否顯示滾動(dòng)的平滑效果。
public boolean onInterceptTouchEvent (MotionEvent ev)
實(shí)現(xiàn)此方法是為了攔截所有觸摸屏幕時(shí)的運(yùn)動(dòng)事件。可以像處理發(fā)送給子視圖的事件一樣去監(jiān)視這些事件,并且獲取當(dāng)前手勢(shì)在任意點(diǎn)的ownership
使用此方法時(shí)候需要注意,因?yàn)樗cView.onTouchEvent(MotionEvent)有相當(dāng)復(fù)雜的交互,并且前提需要正確執(zhí)行View.onTouchEvent(MotionEvent)。事件將按照如下順序接收到:
1. 收到down事件
2. Down事件或者由視圖組的一個(gè)子視圖處理,或者被用戶自己的onTouchEvent()方法處理;此處理意味你應(yīng)該執(zhí)行onTouchEvent()時(shí)返回true,這樣才能繼續(xù)看到剩下的手勢(shì)(取代找一個(gè)父視圖處理)。如果onTouchEvent()返回true時(shí),你不會(huì)收到onInterceptTouchEvent()的任何事件并且所有對(duì)觸摸的處理必須在onTouchEvent()中發(fā)生。
3. 如果此方法返回false,接下來(lái)的事件(up to and including the final up)將***被傳遞當(dāng)此,然后是目標(biāo)的onTouchEvent()。
4. 如果返回true,將不會(huì)收到以下任何事件:目標(biāo)view將收到同樣的事件但是會(huì)伴隨ACTION_CANCEL,并且所有的更進(jìn)一步的事件將會(huì)傳遞到你自己的onTouchEvent()方法中而不會(huì)再在這里出現(xiàn)。
參數(shù)
ev 體系向下發(fā)送的動(dòng)作事件
返回值
如果將運(yùn)動(dòng)事件從子視圖中截獲并且通過(guò)onTouchEvent()發(fā)送到當(dāng)前ViewGroup ,返回true。當(dāng)前目標(biāo)將會(huì)收到ACTION_CANCEL事件,并且不再會(huì)有其他消息傳遞到此。
、
public boolean onTouchEvent (MotionEvent ev)
執(zhí)行此方法為了處理觸摸屏幕的運(yùn)動(dòng)事件。
參數(shù)
ev 運(yùn)動(dòng)事件
返回值
事件被處理返回true,其它返回false。
public boolean pageScroll (int direction)
響應(yīng)短按“page up/ down”時(shí)候?qū)L動(dòng)的處理。此方法將向上或者向下滾動(dòng)一屏,并且將焦點(diǎn)置于新可視區(qū)域的最上/最下。如果沒(méi)有適合的component作為焦點(diǎn),當(dāng)前scrollView將收回焦點(diǎn)。
參數(shù)
direction 滾動(dòng)方向:FOCUS_UP表示向上翻一頁(yè),F(xiàn)OCUS_DOWN表示向下翻一頁(yè)。
返回值
此key事件被消耗(cosumed)返回true,其他返回false。
public void requestChildFocus (View child, View focused)
當(dāng)父視圖的一個(gè)子視圖的要獲得焦點(diǎn)時(shí),調(diào)用此方法。
參數(shù)
child 要獲得焦點(diǎn)的父視圖的子視圖。此視圖包含了焦點(diǎn)視圖。如果沒(méi)有特殊徐要求,此視圖實(shí)際上就是焦點(diǎn)視圖。
focused 子視圖的子孫視圖并且此子孫視圖是真正的焦點(diǎn)視圖
public boolean requestChildRectangleOnScreen (View child, Rect rectangle, boolean immediate)
當(dāng)組里的某個(gè)子視圖需要被定位在屏幕的某個(gè)矩形范圍時(shí),調(diào)用此方法。重載此方法的ViewGroup可確認(rèn)以下幾點(diǎn):
* 子項(xiàng)目將是組里的直系子項(xiàng)
* 矩形將在子項(xiàng)目的坐標(biāo)體系中
重載此方法的ViewGroup應(yīng)該支持以下幾點(diǎn):
* 若矩形已經(jīng)是可見(jiàn)的,則沒(méi)有東西會(huì)改變
* 為使矩形區(qū)域全部可見(jiàn),視圖將可以被滾動(dòng)顯示
參數(shù)
child 發(fā)出請(qǐng)求的子視圖
rectangle 子項(xiàng)目坐標(biāo)系內(nèi)的矩形,即此子項(xiàng)目希望在屏幕上的定位
immediate 設(shè)為true,則禁止動(dòng)畫和平滑移動(dòng)滾動(dòng)條
返回值
進(jìn)行了滾動(dòng)操作的這個(gè)組(group),是否處理此操作。
public void requestLayout ()
當(dāng)有改變引起當(dāng)前視圖重新布局時(shí),調(diào)用此函數(shù)。它將規(guī)劃一個(gè)視圖樹(shù)的layout路徑。
public void scrollTo (int x, int y)
設(shè)置當(dāng)前視圖滾動(dòng)到的位置。此函數(shù)會(huì)引起對(duì)onScrollChanged(int, int, int, int)函數(shù)的調(diào)用并且會(huì)讓視圖更新。
當(dāng)前版本取消了在子視圖中的滾動(dòng)。
參數(shù)
x 滾動(dòng)到的X位置
y 滾動(dòng)到的Y位置
public void setFillViewport (boolean fillViewport)
設(shè)置當(dāng)前滾動(dòng)視圖是否將內(nèi)容高度拉伸以填充視圖可視范圍(譯者注:viewport可視范圍,參見(jiàn)決定Scrollviewer里面Control的可視范圍)。
參數(shù)
fillViewport 設(shè)置為true表示拉伸內(nèi)容高度來(lái)適應(yīng)視口邊界;其他設(shè)為false。
public void setOverScrollMode (int mode)
為視圖設(shè)置over-scroll模式。有效的over-scroll模式有OVER_SCROLL_ALWAYS(缺省值),OVER_SCROLL_IF_CONTENT_SCROLLS(只允許當(dāng)視圖內(nèi)容大過(guò)容器時(shí),進(jìn)行over-scrolling)和OVER_SCROLL_NEVER。只有當(dāng)視圖可以滾動(dòng)時(shí),此項(xiàng)設(shè)置才起作用。
(譯者注:這個(gè)函數(shù)是2.3 r1 中新增的,API Level 9。關(guān)于over-scroll這里譯為彈性滾動(dòng),即,參見(jiàn)帖子:類似iPhone的彈性ListView滾動(dòng))
參數(shù)
mode The new over-scroll mode for this view.
public void setSmoothScrollingEnabled (boolean smoothScrollingEnabled)
用來(lái)設(shè)置箭頭滾動(dòng)是否可以引發(fā)視圖滾動(dòng)。
參數(shù)
smoothScrollingEnabled 設(shè)置箭頭滾動(dòng)是否可以引起內(nèi)容的滾動(dòng)的bool值
public final void smoothScrollBy (int dx, int dy)
類似于scrollBy(int, int),但是滾動(dòng)時(shí)候是平緩的而不是立即滾動(dòng)到某處。
參數(shù)
dx 在X方向滾動(dòng)的像素?cái)?shù)
dy 在Y方向滾動(dòng)的像素?cái)?shù)
public final void smoothScrollTo (int x, int y)
類似于scrollTo(int, int),但是滾動(dòng)時(shí)候是平緩的而不是立即滾動(dòng)到某處。
參數(shù)
x 要滾動(dòng)到位置的X坐標(biāo)
y 要滾動(dòng)到位置的Y坐標(biāo)
受保護(hù)方法
protected int computeScrollDeltaToGetChildRectOnScreen (Rect rect)
計(jì)算X方向滾動(dòng)的總合,以便在屏幕上顯示子視圖的完整矩形(或者,若矩形寬度超過(guò)屏幕寬度,至少要填滿***個(gè)屏幕大小)。
參數(shù)
rect 矩形
返回值
滾動(dòng)差值
protected int computeVerticalScrollOffset ()
計(jì)算垂直方向滾動(dòng)條的滑塊的偏移。此值用來(lái)計(jì)算滾動(dòng)條軌跡的滑塊的位置。
范圍可以以任意單位表示,但是必須與computeVerticalScrollRange()和computeVerticalScrollExtent()的單位一致。
缺省的偏移是在當(dāng)前視圖滾動(dòng)的偏移。
返回值
滾動(dòng)條的滑塊垂直方向的偏移。
protected int computeVerticalScrollRange ()
滾動(dòng)視圖的可滾動(dòng)范圍是所有子元素的高度。
返回值
由垂直方向滾動(dòng)條代表的所有垂直范圍,缺省的范圍是當(dāng)前視圖的畫圖高度。
protected float getBottomFadingEdgeStrength ()
返回滾動(dòng)底部的能見(jiàn)度。能見(jiàn)度的值的范圍是0.0(沒(méi)有消失)到1.0(完全消失)之間。缺省的執(zhí)行返回值為0.0或者1.0,而不是他們中間的某個(gè)值。滾動(dòng)時(shí)子類需要重載這個(gè)方法來(lái)提供一個(gè)平緩的漸隱的實(shí)現(xiàn)。
返回值
滾動(dòng)底部能見(jiàn)度,值的范圍在浮點(diǎn)數(shù)0.0f到1.0f之間。
protected float getTopFadingEdgeStrength ()
返回滾動(dòng)頂部的能見(jiàn)度。能見(jiàn)度的值的范圍是0.0(沒(méi)有消失)到1.0(完全消失)之間。缺省的執(zhí)行返回值為0.0或者1.0,而不是他們中間的某個(gè)值。滾動(dòng)時(shí)子類需要重載這個(gè)方法來(lái)提供一個(gè)平緩的漸隱的實(shí)現(xiàn)。
返回值
滾動(dòng)頂部能見(jiàn)度,值的范圍在浮點(diǎn)數(shù)0.0f到1.0f之間。
protected void measureChild (View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec)
要求當(dāng)前視圖的一個(gè)子視圖測(cè)量自己,同時(shí)兼顧到當(dāng)前視圖的MeasureSpec的要求和它的空白。子視圖必須有MarginLayoutParams。比較復(fù)雜的工作是在getChildMeasureSpec中完成的。
參數(shù)
child 需要自己測(cè)量的子視圖
parentWidthMeasureSpec 當(dāng)前視圖要求的寬度
parentHeightMeasureSpec 當(dāng)前視圖要求的寬度
protected void measureChildWithMargins (View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed)
要求當(dāng)前視圖的一個(gè)子視圖測(cè)量自己,同時(shí)兼顧到當(dāng)前視圖的MeasureSpec的要求和它的空白和邊界。子視圖必須有MarginLayoutParams。比較復(fù)雜的工作是在getChildMeasureSpec中完成的。
參數(shù)
child 需要測(cè)量的子視圖
parentWidthMeasureSpec 當(dāng)前視圖要求的寬度
widthUsed 水平方向上由父視圖使用的空白 (也可能是視圖的其他子視圖使用的)
parentHeightMeasureSpec 當(dāng)前視圖要求的寬度
heightUsed 垂直方向上由父視圖使用的空白 (也可能是視圖的其他子視圖使用的)
protected void onLayout (boolean changed, int l, int t, int r, int b)
當(dāng)前視圖需要為子視圖分配大小和位置時(shí)候調(diào)用,子類繼承必須要重載此方法并調(diào)用自己子視圖的layout函數(shù)。
參數(shù)
changed 當(dāng)前視圖的新的大小或者位置
l 相對(duì)父視圖,左邊界位置
t 相對(duì)父視圖,上邊界位置
r 相對(duì)父視圖,右邊界位置
b 相對(duì)父視圖,下邊界位置
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
測(cè)量視圖以確定其內(nèi)容寬度和高度。此方法被measure(int, int)調(diào)用。需要被子類重寫以提供對(duì)其內(nèi)容準(zhǔn)確高效的測(cè)量。
約定:當(dāng)重寫此方法時(shí),你必須調(diào)用setMeasuredDimension(int, int)來(lái)保存當(dāng)前視圖view的寬度和高度。不成功調(diào)用此方法將會(huì)導(dǎo)致一個(gè)IllegalStateException異常,是由measure(int, int)拋出。所以調(diào)用父類的onMeasure(int, int)方法是必須的。
父類的實(shí)現(xiàn)是以背景大小為默認(rèn)大小,除非MeasureSpec(測(cè)量細(xì)則)允許更大的背景。子類可以重寫onMeasure(int,int)以對(duì)其內(nèi)容提供更佳的尺寸。
如果此方法被重寫,那么子類的責(zé)任是確認(rèn)測(cè)量高度和測(cè)量寬度要大于視圖view的最小寬度和最小高度(getSuggestedMinimumHeight() 和 getSuggestedMinimumWidth()),使用這兩個(gè)方法可以取得最小寬度和最小高度。
參數(shù)
widthMeasureSpec 受主窗口支配的水平空間要求。這個(gè)需求通過(guò) View.MeasureSpec.進(jìn)行編碼。
heightMeasureSpec 受主窗口支配的垂直空間要求。這個(gè)需求通過(guò) View.MeasureSpec.進(jìn)行編碼。
protected void onOverScrolled (int scrollX, int scrollY, boolean clampedX, boolean clampedY)
被overScrollBy(int, int, int, int, int, int, int, int, boolean)調(diào)用,來(lái)對(duì)一個(gè)over-scroll操作的結(jié)果進(jìn)行響應(yīng)。(譯者注:這個(gè)函數(shù)是2.3 r1 中新增的,API Level 9)
參數(shù)
scrollX 新的X滾動(dòng)像素值
scrollY 新的Y滾動(dòng)像素值
clampedX 當(dāng)scrollX被over-scroll的邊界限制時(shí),值為true
clampedY 當(dāng)scrollY被over-scroll的邊界限制時(shí),值為true
protected boolean onRequestFocusInDescendants (int direction, Rect previouslyFocusedRect)
當(dāng)在滾動(dòng)視圖的子視圖中查找焦點(diǎn)視圖時(shí),需要注意不要將焦點(diǎn)設(shè)置在滾動(dòng)出屏幕外的控件上。此方法會(huì)比執(zhí)行缺省的ViewGroup代價(jià)高,否則此行為也會(huì)設(shè)置為缺省
參數(shù)
direction 指定下列常量之一:FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT
previouslyFocusedRect 能夠給出一個(gè)較好的提示的矩形(當(dāng)前視圖的坐標(biāo)系統(tǒng))表示焦點(diǎn)從哪里得來(lái)。如果沒(méi)有提示為null。
返回值
是否取得了焦點(diǎn)
protected void onSizeChanged (int w, int h, int oldw, int oldh)
布局期間當(dāng)視圖的大小發(fā)生改變時(shí)調(diào)用。如果只是添加到視圖,調(diào)用時(shí)顯示的是舊值0。(譯者注:也就是添加到視圖時(shí),oldw和oldh返回的是0)。
參數(shù)
w 視圖當(dāng)前寬度
h 視圖當(dāng)前高度
oldw 視圖改變前的寬度
oldh 視圖改變前的高度
本文鏈接:http://my.oschina.net/u/1014842/blog/299050
【編輯推薦】
- 深度定制Android崛起 谷歌遭遇變種危機(jī)
- Android中的Context的作用
- 七個(gè)讓你意想不到的Android系統(tǒng)應(yīng)用領(lǐng)域
- 主流Android設(shè)備分辨率簡(jiǎn)報(bào)
【責(zé)任編輯:chenqingxiang TEL:(010)68476606】