?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
ScrollView
版本:Android 2.3 r1
?
結(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)
?????? 添加子視圖。如果事先沒有給子視圖設(shè)置layout參數(shù),會(huì)采用當(dāng)前ViewGroup的默認(rèn)參數(shù)來設(shè)置子視圖。
????????????? 參數(shù)
???????????????????? child?????? 所添加的子視圖
?
public void addView (View child, int index)
添加子視圖。如果事先沒有給子視圖設(shè)置layout參數(shù),會(huì)采用當(dāng)前ViewGroup的默認(rèn)參數(shù)來設(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ì)象來實(shí)現(xiàn)滾動(dòng)操作,會(huì)使得此方法被調(diào)用。
?
public boolean dispatchKeyEvent (KeyEvent event)
?????? 發(fā)送一個(gè)key事件給當(dāng)前焦點(diǎn)路徑的下一個(gè)視圖。此焦點(diǎn)路徑從視圖樹的頂層執(zhí)行直到當(dāng)前焦點(diǎn)視圖。如果此視圖為焦點(diǎn)視圖,將為自己發(fā)送。否則,會(huì)為當(dāng)前焦點(diǎn)路徑的下一個(gè)節(jié)點(diǎn)發(fā)送。此方法也會(huì)激起一個(gè)key監(jiān)聽器。
參數(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ù)來使?jié)L動(dòng)視圖執(zhí)行滾動(dòng),類似于處理由視圖體系發(fā)送的事件。
參數(shù)
event???? 需要執(zhí)行key的事件
返回值
事件被處理返回true,否則返回false。
?
public void fling (int velocityY)
滾動(dòng)視圖的滑動(dòng)(fling)手勢。(譯者注: 如何監(jiān)聽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ū)域的最頂部/最底部組件。若沒有適合的組件做焦點(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可視范圍,參見 決定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)事件??梢韵裉幚戆l(fā)送給子視圖的事件一樣去監(jiān)視這些事件,并且獲取當(dāng)前手勢在任意點(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ù)看到剩下的手勢(取代找一個(gè)父視圖處理)。如果onTouchEvent()返回true時(shí),你不會(huì)收到onInterceptTouchEvent()的任何事件并且所有對(duì)觸摸的處理必須在onTouchEvent()中發(fā)生。
3.??? 如果此方法返回false,接下來的事件(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)事件從子視圖中截獲并且通過onTouchEvent()發(fā)送到當(dāng)前ViewGroup ,返回true。當(dāng)前目標(biāo)將會(huì)收到ACTION_CANCEL事件,并且不再會(huì)有其他消息傳遞到此。
????????????? (譯者注:onInterceptTouchEvent和onTouchEvent調(diào)用時(shí)序 )
?
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ū)域的最上/最下。如果沒有適合的component作為焦點(diǎn),當(dāng)前scrollView將收回焦點(diǎn)。
參數(shù)
???? direction??????? 滾動(dòng)方向:FOCUS_UP
表示向上翻一頁,FOCUS_DOWN
表示向下翻一頁。
返回值
此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)視圖。如果沒有特殊徐要求,此視圖實(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)是可見的,則沒有東西會(huì)改變
??? * 為使矩形區(qū)域全部可見,視圖將可以被滾動(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è)視圖樹的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可視范圍,參見 決定Scrollviewer里面Control的可視范圍 )。
參數(shù)
???? fillViewport??? 設(shè)置為true表示拉伸內(nè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)容大過容器時(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),即,參見帖子: 類似iPhone的彈性ListView滾動(dòng) )
???????? 參數(shù)
?????????????????? mode ????? The new over-scroll mode for this view.
?
public void setSmoothScrollingEnabled (boolean smoothScrollingEnabled)
用來設(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)的總合,以便在屏幕上顯示子視圖的完整矩形(或者,若矩形寬度超過屏幕寬度,至少要填滿第一個(gè)屏幕大小)。
參數(shù)
???? rect??????? 矩形
返回值
滾動(dòng)差值
?
protected int computeVerticalScrollOffset ()
計(jì)算垂直方向滾動(dòng)條的滑塊的偏移。此值用來計(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)底部的能見度。能見度的值的范圍是0.0(沒有消失)到1.0(完全消失)之間。缺省的執(zhí)行返回值為0.0或者1.0,而不是他們中間的某個(gè)值。滾動(dòng)時(shí)子類需要重載這個(gè)方法來提供一個(gè)平緩的漸隱的實(shí)現(xiàn)。
返回值
滾動(dòng)底部能見度,值的范圍在浮點(diǎn)數(shù)0.0f到1.0f之間。
?
protected float getTopFadingEdgeStrength ()
返回滾動(dòng)頂部的能見度。能見度的值的范圍是0.0(沒有消失)到1.0(完全消失)之間。缺省的執(zhí)行返回值為0.0或者1.0,而不是他們中間的某個(gè)值。滾動(dòng)時(shí)子類需要重載這個(gè)方法來提供一個(gè)平緩的漸隱的實(shí)現(xiàn)。
返回值
滾動(dòng)頂部能見度,值的范圍在浮點(diǎn)數(shù)0.0f到1.0f之間。
?
protected void measureChild (View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec)
要求當(dāng)前視圖的一個(gè)子視圖測量自己,同時(shí)兼顧到當(dāng)前視圖的MeasureSpec的要求和它的空白。子視圖必須有MarginLayoutParams。比較復(fù)雜的工作是在getChildMeasureSpec中完成的。
參數(shù)
child?????? ?????? 需要自己測量的子視圖
parentWidthMeasureSpec ?????? 當(dāng)前視圖要求的寬度
parentHeightMeasureSpec?????? ?????? 當(dāng)前視圖要求的寬度
?
protected void measureChildWithMargins (View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed)
要求當(dāng)前視圖的一個(gè)子視圖測量自己,同時(shí)兼顧到當(dāng)前視圖的MeasureSpec的要求和它的空白和邊界。子視圖必須有MarginLayoutParams。比較復(fù)雜的工作是在getChildMeasureSpec中完成的。
參數(shù)
child????? ?????? 需要測量的子視圖
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)
測量視圖以確定其內(nèi)容寬度和高度。此方法被measure(int, int)調(diào)用。需要被子類重寫以提供對(duì)其內(nèi)容準(zhǔn)確高效的測量。
約定:當(dāng)重寫此方法時(shí),你必須調(diào)用setMeasuredDimension(int, int)來保存當(dāng)前視圖view的寬度和高度。不成功調(diào)用此方法將會(huì)導(dǎo)致一個(gè)IllegalStateException異常,是由measure(int, int)拋出。所以調(diào)用父類的onMeasure(int, int)方法是必須的。
父類的實(shí)現(xiàn)是以背景大小為默認(rèn)大小,除非MeasureSpec(測量細(xì)則)允許更大的背景。子類可以重寫onMeasure(int,int)以對(duì)其內(nèi)容提供更佳的尺寸。
如果此方法被重寫,那么子類的責(zé)任是確認(rèn)測量高度和測量寬度要大于視圖view的最小寬度和最小高度(getSuggestedMinimumHeight() 和 getSuggestedMinimumWidth()),使用這兩個(gè)方法可以取得最小寬度和最小高度。
參數(shù)
widthMeasureSpec 受主窗口支配的水平空間要求。這個(gè)需求通過 View.MeasureSpec.進(jìn)行編碼。
?????? heightMeasureSpec???????? 受主窗口支配的垂直空間要求。這個(gè)需求通過 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)用,來對(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)從哪里得來。如果沒有提示為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?????? ?????? 視圖改變前的高度
?
補(bǔ)充
文章精選
Android ApiDemos/ScrollView2 添加自動(dòng)滾動(dòng)和智能焦點(diǎn)切換
[Android學(xué)習(xí)指南] 使用ScrollView實(shí)現(xiàn)滾動(dòng)效果
Android中ScrollView與ListView共用問題的解決方案
?