ScrollViewAPI幫助文件
結構
繼承關係
public class ScrollView extends FrameLayout
java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.FrameLayout
android.widget.ScrollView
類概述
一種可供使用者滾動的層次結構佈局容器,允許顯示比實際多的內容。
ScrollView是一種FrameLayout,意味需要在其上放置有自己滾動內容的子元素。子元素可以是一個複雜的物件的佈局管理器。通常用的子元素是垂直方向的
TextView類也有自己的滾動功能,所以不需要使用ScrollView,但是隻有兩個結合使用,才能保證顯示較多內容時候的效率。但只有兩者結合使用才可以實現在一個較大的容器中一個文字檢視效果。
ScrollView只支援垂直方向的滾動。
建構函式
public ScrollView (Context context)
建立一個預設屬性的ScrollView例項。
public ScrollView (Context context, AttributeSet attrs)
建立一個帶有attrs屬性的ScrollView 例項。
public ScrollView (Context context, AttributeSet attrs, int defStyle)
建立一個帶有attrs屬性,並且指定其預設樣式的ScrollView例項。
公共方法
public void addView (View child)
新增子檢視。如果事先沒有給子檢視設定layout引數,會採用當前ViewGroup的預設引數來設定子檢視。
引數
child 所新增的子檢視
public void addView (View child, int index)
新增子檢視。如果事先沒有給子檢視設定layout引數,會採用當前
ViewGroup的預設引數來設定子檢視。
引數
child 所新增的子檢視
index 新增子檢視的位置
public void addView (View child, int index,
ViewGroup.LayoutParams params)
根據指定的layout引數新增子視圖
引數
child 所新增的子檢視
index 新增子檢視的位置
params 為子檢視設定的layout引數
public void addView (View child, ViewGroup.LayoutParams params)
根據指定的layout引數新增子檢視。
引數
child 所新增的子檢視
params 為子檢視設定的layout引數
public boolean arrowScroll (int direction)
響應點選上下箭頭時對滾動條滾動的處理。
引數
direction 按下的箭頭所對應的方向
返回值
如果我們處理(消耗)了此事件返回true,否則返回false。
public void computeScroll ()
被父檢視呼叫,用於必要時候對其子檢視的值(mScrollX和mScrollY)進行更新。典型的情況如:父檢視中某個子檢視使用一個Scroller物件來實現滾動操作,會使得此方法被呼叫。
public boolean dispatchKeyEvent (KeyEvent event)
傳送一個key事件給當前焦點路徑的下一個檢視。此焦點路徑從檢視樹的頂層執行直到當前焦點檢視。如果此檢視為焦點檢視,將為自己傳送。否則,會為當前焦點路徑的下一個節點發送。此方法也會激起一個key監聽器。
引數
event 傳送的key事件
返回值
事件被處理返回true,否則返回false。
public void draw (Canvas canvas)
手動繪製檢視(及其子檢視)到指定的畫布(Canvas)。這個檢視必須在呼叫這個函式之前做好了整體佈局。當實現一個檢視時,不需要繼承這個方法;相反,你應該實現onDraw(Canvas)方法。
引數
canvas 繪製檢視的畫布
public boolean executeKeyEvent (KeyEvent event)
當接收到key事件時,使用者可以呼叫此函式來使滾動檢視執行滾動,類似於處理由檢視體系傳送的事件。
引數
event 需要執行key的事件
返回值
事件被處理返回true,否則返回false。
public void fling (int velocityY)
滾動檢視的滑動(fling)手勢。(譯者注: 如何監聽android的螢幕滑動停止事件)
引數
velocityY Y方向的初始速率。正值表示手指/游標向螢幕下方滑動,而內容將向上滾動。
public boolean fullScroll (int direction)
對響應“home/end”短按時響應滾動處理。此方法將檢視滾動到頂部或者底部,並且將焦點置於新的可視區域的最頂部/最底部元件。若沒有適合的元件做焦點,當前的ScrollView會收回焦點。
引數
direction 滾動方向:FOCUS_UP表示檢視向上滾動;FOCUS_DOWN表示檢視向下滾動
返回值
若key事件被消耗(consumed)返回true,其他情況返回false。
public int getMaxScrollAmount ()
返回值
當前滾動檢視響應箭頭事件能夠滾動的最大數。
public boolean isFillViewport ()
指示當前ScrollView的內容是否被拉伸以填充檢視可視範圍(譯者注:
viewport可視範圍,參見決定Scrollviewer裡面Control的可視範圍)。
返回值
內容填充檢視返回true,否則返回false。
public boolean isSmoothScrollingEnabled ()
返回值
按箭頭方向滾動時,是否顯示滾動的平滑效果。
public boolean onInterceptTouchEvent (MotionEvent ev)
是用於處理事件(重點onInterceptTouchEvent這個事件是從父控制元件開始往子控制元件傳的,直到有攔截或者到沒有這個事件的view,然後就往回從子到父控制元件)(類似於預處理,當然也可以不處理)並改變事件的傳遞方向,
也就是決定是否允許Touch事件繼續向下(子控制元件)傳遞。
實現此方法是為了攔截所有觸控式螢幕幕時的運動事件。可以像處理髮送給子檢視的事件一樣去監視這些事件,並且獲取當前手勢在任意點的ownership
使用此方法時候需要注意,因為它與View.onTouchEvent(MotionEvent)有相當複雜的互動,並且前提需要正確執行View.onTouchEvent(MotionEvent)。事件將按照如下順序接收到:
1. 收到down事件
2. Down事件或者由檢視組的一個子檢視處理,或者被使用者自己的onTouchEvent()方法處理;此處理意味你應該執行onTouchEvent()時返回true,這樣才能繼續看到剩下的手勢(取代找一個父檢視處理)。如果onTouchEvent()返回true時,你不會收到onInterceptTouchEvent()的任何事件並且所有對觸控的處理必須在onTouchEvent()中發生。
3. 如果此方法返回false,接下來的事件(up to and including the final up)將最先被傳遞當此,然後是目標的onTouchEvent()。
4. 如果返回true,將不會收到以下任何事件:目標view將收到同樣的事件但是會伴隨ACTION_CANCEL,並且所有的更進一步的事件將會傳遞到你自己的onTouchEvent()方法中而不會再在這裡出現。
引數
ev 體系向下傳送的動作事件
返回值
返回True(代表事件在當前的viewGroup中會被處理),則向下傳遞之路被截斷(所有子控制元件將沒有機會參與Touch事件), 同時把事件傳遞給當前的控制元件的onTouchEvent()處理;
返回false,則把事件交給子控制元件的onInterceptTouchEvent();
如果將運動事件從子檢視中截獲並且通過onTouchEvent()傳送到當前ViewGroup ,返回true。當前目標將會收到ACTION_CANCEL事件,並且不再會有其他訊息傳遞到此。
public boolean onTouchEvent (MotionEvent ev)
執行此方法為了處理觸控式螢幕幕的運動事件。
用於處理事件(重點onTouch這個事件是從子控制元件回傳到父控制元件的,一層層向下傳),返回值決定當前控制元件是否消費(consume)了這個事件,
* 也就是說在當前控制元件在處理完Touch事件後,是否還允許Touch事件繼續向上(父控制元件)傳遞。
* 返回false,則向上傳遞給父控制元件,詳細一點就是這個touch事件就給了父控制元件,那麼後面的up事件就是到這裡touch觸發,
* 不會在傳給它的子控制元件。如果父控制元件依然是false,那touch的處理就給到父控制元件的父控制元件,那麼up的事件處理都在父控制元件的父控制元件,不會觸發下面的。
* 返回true,如果是子控制元件返回true,那麼它的touch事件都在這裡處理,父控制元件是處理不了,因為它收不到子控制元件傳給他的touch,被子控制元件給攔截了。
引數
ev 運動事件
返回值
事件被處理返回true,其它返回false。
public boolean pageScroll (int direction)
響應短按“page up/ down”時候對滾動的處理。此方法將向上或者向下滾動一屏,並且將焦點置於新可視區域的最上/最下。如果沒有適合的component作為焦點,當前scrollView將收回焦點。
引數
direction 滾動方向:FOCUS_UP表示向上翻一頁,FOCUS_DOWN表示向下翻一頁。
返回值
此key事件被消耗(cosumed)返回true,其他返回false。
public void requestChildFocus (View child, View focused)
當父檢視的一個子檢視的要獲得焦點時,呼叫此方法。
引數
child 要獲得焦點的父檢視的子檢視。此檢視包含了焦點檢視。如果沒有特殊徐要求,此檢視實際上就是焦點檢視。
focused 子檢視的子孫檢視並且此子孫檢視是真正的焦點檢視
public boolean requestChildRectangleOnScreen (View child, Rect rectangle, boolean immediate)
當組裡的某個子檢視需要被定位在螢幕的某個矩形範圍時,呼叫此方法。過載此方法的ViewGroup可確認以下幾點:
* 子專案將是組裡的直系子項
* 矩形將在子專案的座標體系中
過載此方法的ViewGroup應該支援以下幾點:
* 若矩形已經是可見的,則沒有東西會改變
* 為使矩形區域全部可見,檢視將可以被滾動顯示
引數
child 發出請求的子檢視
rectangle 子專案座標系內的矩形,即此子專案希望在螢幕上的定位
immediate 設為true,則禁止動畫和平滑移動滾動條
返回值
進行了滾動操作的這個組(group),是否處理此操作。
public void requestLayout ()
當有改變引起當前檢視重新佈局時,呼叫此函式。它將規劃一個檢視樹的layout路徑。
public void scrollTo (int x, int y)
設定當前檢視滾動到的位置。此函式會引起對onScrollChanged(int, int, int, int)函式的呼叫並且會讓檢視更新。
當前版本取消了在子檢視中的滾動。
引數
x 滾動到的X位置
y 滾動到的Y位置
public void setFillViewport (boolean fillViewport)
設定當前滾動檢視是否將內容高度拉伸以填充檢視可視範圍(譯者注:
viewport可視範圍,參見決定Scrollviewer裡面Control的可視範圍)。
引數
fillViewport 設定為true表示拉伸內容高度來適應視口邊界;其他設為false。
public void setOverScrollMode (int mode)
為檢視設定over-scroll模式。有效的over-scroll模式有OVER_SCROLL_ALWAYS(預設值),OVER_SCROLL_IF_CONTENT_SCROLLS(只允許當檢視內容大過容器時,進行over-scrolling)和OVER_SCROLL_NEVER。只有當檢視可以滾動時,此項設定才起作用。
(譯者注:這個函式是2.3 r1 中新增的,API Level 9。關於over-scroll這裡譯為彈性滾動,即,參見帖子:類似iPhone的彈性ListView滾動)
引數
mode The new over-scroll mode for this view.
public void setSmoothScrollingEnabled (boolean smoothScrollingEnabled)
用來設定箭頭滾動是否可以引發檢視滾動。
引數
smoothScrollingEnabled 設定箭頭滾動是否可以引起內容的滾動的boolean值
public final void smoothScrollBy (int dx, int dy)
類似於scrollBy(int, int),但是滾動時候是平緩的而不是立即滾動到某處。
引數
dx 在X方向滾動的畫素數
dy 在Y方向滾動的畫素數
public final void smoothScrollTo (int x, int y)
類似於scrollTo(int, int),但是滾動時候是平緩的而不是立即滾動到某處。
引數
x 要滾動到位置的X座標
y 要滾動到位置的Y座標
受保護方法
protected int computeScrollDeltaToGetChildRectOnScreen (Rect rect)
計算X方向滾動的總合,以便在螢幕上顯示子檢視的完整矩形(或者,若矩形寬度超過螢幕寬度,至少要填滿第一個螢幕大小)。
引數
rect 矩形
返回值
滾動差值
protected int computeVerticalScrollOffset ()
計算垂直方向滾動條的滑塊的偏移。此值用來計算滾動條軌跡的滑塊的位置。
範圍可以以任意單位表示,但是必須與computeVerticalScrollRange()和computeVerticalScrollExtent()的單位一致。
預設的偏移是在當前檢視滾動的偏移。
返回值
滾動條的滑塊垂直方向的偏移。
protected int computeVerticalScrollRange ()
滾動檢視的可滾動範圍是所有子元素的高度。
返回值
由垂直方向滾動條代表的所有垂直範圍,預設的範圍是當前檢視的畫圖高度。
protected float getBottomFadingEdgeStrength ()
返回滾動底部的能見度。能見度的值的範圍是0.0(沒有消失)到1.0(完全消失)之間。預設的執行返回值為0.0或者1.0,而不是他們中間的某個值。滾動時子類需要過載這個方法來提供一個平緩的漸隱的實現。
返回值
滾動底部能見度,值的範圍在浮點數0.0f到1.0f之間。
protected float getTopFadingEdgeStrength ()
返回滾動頂部的能見度。能見度的值的範圍是0.0(沒有消失)到1.0(完全消失)之間。預設的執行返回值為0.0或者1.0,而不是他們中間的某個值。滾動時子類需要過載這個方法來提供一個平緩的漸隱的實現。
返回值
滾動頂部能見度,值的範圍在浮點數0.0f到1.0f之間。
protected void measureChild (View child, int parentWidthMeasureSpec,
int parentHeightMeasureSpec)
要求當前檢視的一個子檢視測量自己,同時兼顧到當前檢視的MeasureSpec的要求和它的空白。子檢視必須有MarginLayoutParams。比較複雜的工作是在getChildMeasureSpec中完成的。
引數
child 需要自己測量的子檢視
parentWidthMeasureSpec 當前檢視要求的寬度
parentHeightMeasureSpec 當前檢視要求的寬度
protected void measureChildWithMargins (View child,
int parentWidthMeasureSpec, int widthUsed,
int parentHeightMeasureSpec, int heightUsed)
要求當前檢視的一個子檢視測量自己,同時兼顧到當前檢視的MeasureSpec的要求和它的空白和邊界。子檢視必須有MarginLayoutParams。比較複雜的工作是在getChildMeasureSpec中完成的。
引數
child 需要測量的子檢視
parentWidthMeasureSpec 當前檢視要求的寬度
widthUsed 水平方向上由父檢視使用的空白 (也可能是檢視的其他子檢視使用的)
parentHeightMeasureSpec 當前檢視要求的寬度
heightUsed 垂直方向上由父檢視使用的空白 (也可能是檢視的其他子檢視使用的)
protected void onLayout (boolean changed, int l, int t, int r, int b)
當前檢視需要為子檢視分配大小和位置時候呼叫,子類繼承必須要過載此方法並呼叫自己子檢視的layout函式。
引數
changed 當前檢視的新的大小或者位置
l 相對父檢視,左邊界位置
t 相對父檢視,上邊界位置
r 相對父檢視,右邊界位置
b 相對父檢視,下邊界位置
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
測量檢視以確定其內容寬度和高度。此方法被measure(int, int)呼叫。需要被子類重寫以提供對其內容準確高效的測量。
約定:當重寫此方法時,你必須呼叫setMeasuredDimension(int, int)來儲存當前檢視view的寬度和高度。不成功呼叫此方法將會導致一個IllegalStateException異常,是由measure(int, int)丟擲。所以呼叫父類的onMeasure(int, int)方法是必須的。
父類的實現是以背景大小為預設大小,除非MeasureSpec(測量細則)允許更大的背景。子類可以重寫onMeasure(int,int)以對其內容提供更佳的尺寸。
如果此方法被重寫,那麼子類的責任是確認測量高度和測量寬度要大於檢視view的最小寬度和最小高度(getSuggestedMinimumHeight() 和 getSuggestedMinimumWidth()),使用這兩個方法可以取得最小寬度和最小高度。
引數
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)呼叫,來對一個over-scroll操作的結果進行響應。(譯者注:這個函式是2.3 r1 中新增的,API Level 9)
引數
scrollX 新的X滾動畫素值
scrollY 新的Y滾動畫素值
clampedX 當scrollX被over-scroll的邊界限制時,值為true
clampedY 當scrollY被over-scroll的邊界限制時,值為true
protected boolean onRequestFocusInDescendants (int direction, Rect previouslyFocusedRect)
當在滾動檢視的子檢視中查詢焦點檢視時,需要注意不要將焦點設定在滾動出螢幕外的控制元件上。此方法會比執行預設的ViewGroup代價高,否則此行為也會設定為預設
引數
direction 指定下列常量之一:FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT
previouslyFocusedRect 能夠給出一個較好的提示的矩形(當前檢視的座標系統)表示焦點從哪裡得來。如果沒有提示為null。
返回值
是否取得了焦點
protected void onSizeChanged (int w, int h, int oldw, int oldh)
佈局期間當檢視的大小發生改變時呼叫。如果只是新增到檢視,呼叫時顯示的是舊值0。(譯者注:也就是新增到檢視時,oldw和oldh返回的是0)。
引數
w 檢視當前寬度
h 檢視當前高度
oldw 檢視改變前的寬度
oldh 檢視改變前的高度