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