?
Ce document utilise Manuel du site Web PHP chinois Libérer
HorizontalScrollView
版本:Android 2.3 r1
?
結(jié)構(gòu)
繼承關(guān)系
public class HorizontalScrollView extends FrameLayout
????????
java.lang.Object
android.view.View
???????? android.view.ViewGroup
?????????????????? android.widget.FrameLayout
??????????????????????????? android.widget.HorizontalScrollView
?
類概述
用于布局的容器,可以放置讓用戶使用滾動條查看的視圖層次結(jié)構(gòu),允許視圖結(jié)構(gòu)比手機的屏幕大。HorizontalScrollView是一種FrameLayout
(框架布局),其子項被滾動查看時是整體移動的,并且子項本身可以是一個有復雜層次結(jié)構(gòu)的布局管理器。一個常見的應用是子項在水平方向中,用戶可以滾動顯示頂層水平排列的子項(items)。
HorizontalScrollView不可以和ListView同時用,因為ListView有自己的滾動條設置。最重要的是,如果在需要顯示很大的list的情況下,兩者同時用則會使ListView在一些重要的優(yōu)化上失效。出現(xiàn)這種失效的原因在于,HorizontalScrollView會強迫ListView用HorizontalScrollView本身提供的空間容器(infinite container)來顯示完整的列表。
?類似的情況,TextView
也有自己的滾動條,所以不需要ScrollView。但這兩者是可以同時使用的,使用的結(jié)果會是在一個更大的容器里顯示文本視圖。
HorizontalScrollView只支持水平方向的滾動顯示。
?
公共方法
public void addView (View child)
添加一個子視圖。若這個子視圖沒有被設置布局參數(shù),則使用ViewGroup的缺省參數(shù)。
參數(shù)
child ??????? 要添加的子視圖
?
public void addView (View child, int index)
添加一個子視圖。若這個子視圖沒有被設置布局參數(shù),則使用ViewGroup的缺省參數(shù)。
參數(shù)
child ??????? 要添加的子視圖
index ????? 子視圖要加入的位置
?
public void addView (View child, int index, ViewGroup.LayoutParams params)
添加一個帶有指定布局參數(shù)的子視圖。
參數(shù)
child ??????? 要添加的子視圖
index ????? 子視圖要加入的位置
params ? 子視圖的布局參數(shù)
?
public void addView (View child, ViewGroup.LayoutParams params)
添加一個帶有指定布局參數(shù)的子視圖。
參數(shù)
child ??????? 要添加的子視圖
params ? 子視圖的布局參數(shù)
?
public boolean arrowScroll (int direction)
響應點擊左右箭頭時對滾動條的處理。
參數(shù)
direction ???????? The direction corresponding to the arrow key that was pressed箭頭按鍵所表示的方向
返回值
??? ???????? 若此事件成功完成,則返回true;否則返回false。
?
public void computeScroll ()
被父視圖調(diào)用,用于必要時候?qū)ζ渥右晥D的值(mScrollX和mScrollY)進行更新。典型的情況如:父視圖中某個子視圖使用一個Scroller
對象來實現(xiàn)滾動操作,會使得此方法被調(diào)用。
?
public boolean dispatchKeyEvent (KeyEvent event)
按照可以獲得焦點的順序(從視圖樹的頂端到當前獲得焦點的視圖),分派一個按鍵事件給下一個視圖。若此視圖為焦點視圖,事件將會分派給它自己。否則它將按照順序,分派給下一個節(jié)點。此方法同時觸動所有按鍵監(jiān)聽器。
參數(shù)
event ????? 被分派的事件.
返回值
??? ???????? 若事件被處理,則返回true;否則為false
?
public void draw (Canvas canvas)
手動繪制視圖(及其子視圖)到指定的畫布(Canvas)。這個視圖必須在調(diào)用這個函數(shù)之前做好了整體布局。。當實現(xiàn)一個視圖時,不需要繼承這個方法;相反,你應該實現(xiàn)onDraw(Canvas)
方法。
參數(shù)
canvas ?? 繪制視圖的畫布
?
public boolean executeKeyEvent (KeyEvent event)
需要通過按鍵事件來實現(xiàn)滾動操作時,可以調(diào)用此方法。效果類似于由視圖樹型結(jié)構(gòu)分派事件。
參數(shù)
event ????? 需要執(zhí)行的事件
返回值
??? ???????? 若事件被處理,則返回true;否則為false
?
public void fling (int velocityX)
滾動視圖的fling手勢。
參數(shù)
velocityX ???????? 方向的初始速率。正值表示手指/光標向屏幕右邊滑動,而內(nèi)容相對向左滾動。
?
public boolean fullScroll (int direction)
處理按下"home/end"快捷鍵之后的滾動響應。此方法會將視圖移左或移右,同時將焦點賦予移動后可視的最左或最右的組件。如果沒有任何組件適合得到焦點,此scrollview將收回焦點。
參數(shù)
direction ???????? 滾動方向:FOCUS_LEFT表示向視圖的左邊移動,FOCUS_RIGHT表示向視圖的右邊移動
返回值
??? ???????? 若此方法消耗(consumed)了按鍵事件則返回true,否則返回false。
?
public int getMaxScrollAmount ()
返回值
??? ???????? 按左右箭頭時視圖可以滾動的最大值。
?
public boolean isFillViewport ()
表示此ScrollView的內(nèi)容是否被拉伸以適應視口(viewport)的大小。
返回值
??? ???????? 若內(nèi)容填充了視口則返回true,否則返回false。
?
public boolean isSmoothScrollingEnabled ()
返回值
??? ???????? 按箭頭方向滾動時,是否顯示滾動的平滑效果。
?
public boolean onInterceptTouchEvent (MotionEvent ev)
使用此方法可以攔截所有觸摸屏動作引發(fā)的事件。這意味著你可以監(jiān)視分派給子項的事件,并且可以拿到任何當前手勢的所有權(quán)。
使用此方法需謹慎。因為它與View.onTouchEvent(MotionEvent)有相當復雜的交互影響。這兩者都必須同時正確地實現(xiàn)。事件將按以下順序來被方法接收:
?? 1. 接收到down事件
?? 2. 事件將被視圖組的一個子視圖處理,或者被傳遞給自己的onTouchEvent()方法處理;這意味著你必須實現(xiàn)onTouchEvent(),并且返回true,這樣才可以接著接受到其他的手勢(而不是尋求一個父視圖來處理它)。onTouchEvent()返回true后,你將不再接受到onInterceptTouchEvent()的任何事件,同時所有對觸摸動作的處理必須像往常一樣在onTouchEvent()中進行。
?? 3. 如果返回false,則接下來的每個事件(所有的up事件,包含最后一個up)將會首先被傳遞到這里,然后到目標對象view的onTouchEvent()。
?? 4. 如果返回ture,你將不會接收到以下任何事件:目標view將會接收到相同的事件,但是帶著ACTION_CANCEL的動作。所有在此之后的事件將會被傳遞到你的onTouchEvent()方法中,并且不再在這里出現(xiàn)。
參數(shù)
ev ?? 沿著樹型結(jié)構(gòu)往下分派的動作事件
???????? 返回值
??? ???????? 若將動作事件從子視圖中截獲并通過onTouchEvent()將他們分派給當前ViewGroup,則返回true。當前目標將收到一個ACTION_CANCEL事件,并且不再會有其他消息被傳遞到這里。
?
public boolean onTouchEvent (MotionEvent ev)
此方法用于處理觸摸屏的動作事件。
參數(shù)
ev ?? 動作事件
???????? 返回值
??? ???????? 若事件被成功處理,則返回true;否則返回false
?
public boolean pageScroll (int direction)
處理按下"page up/down"快捷鍵之后的滾動響應。此方法會將視圖往左或往右滾動一個頁面的距離,同時將焦點賦予移動后可視的最左或最右的組件。如果沒有任何組件適合得到焦點,此scrollview將收回焦點。
參數(shù)
direction ???????? 滾動方向:FOCUS_LEFT表示向視圖的左邊移動一個頁面FOCUS_RIGHT表示向視圖的右邊移動一個頁面
???????? 返回值
??? ???????? 若此方法處理(consumed)了按鍵事件則返回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 ()
當出現(xiàn)使視圖布局失效的改變時,調(diào)用此方法。它將規(guī)劃一個視圖樹的布局路徑。
?
public void scrollTo (int x, int y)
設置視圖滾動后的位置。這將引起onScrollChanged(int,int,int,int)的調(diào)用,同時使此視圖失效。
此版本同時將滾動鎖定于子視圖的范圍。
參數(shù)
x ???? 要滾動到的x位置
y ???? 要滾動到的y位置
?
public void setFillViewport (boolean fillViewport)
設置此滾動視圖是否將內(nèi)容寬度拉伸來適應視口(viewport)。
參數(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ù)
mode ????? 視圖的新over-scroll模式值
?
public void setSmoothScrollingEnabled (boolean smoothScrollingEnabled)
設置是否呈現(xiàn)按下箭頭后的平滑滾動效果(動畫效果)。
參數(shù)
smoothScrollingEnabled ???????? 設置是否呈現(xiàn)平滑滾動效果
?
public final void smoothScrollBy (int dx, int dy)
類似scrollBy(int, int)
,但是呈現(xiàn)平滑滾動,而非瞬間滾動(譯者注:瞬間滾動——指不顯示滾動過程,直接顯示滾動后達到的位置)。
參數(shù)
dx ?? 要滾動的X軸像素差值(譯者注:橫向像素差值)
dy ?? 要滾動的Y軸像素差值(譯者注:縱向像素差值)
?
public final void smoothScrollTo (int x, int y)
類似scrollTo(int, int)
,但是呈現(xiàn)平滑滾動,而不是瞬間滾動。
參數(shù)
x ???? 滾動要到達位置的X軸值
y ???? 滾動要到達位置的Y軸值
?
受保護方法
???????? protected int computeHorizontalScrollOffset ()
計算水平方向滾動條的滑塊的偏移值。此值用來計算滾動時滑塊的位置。
偏移值的范圍可以以任何單位表示,但必須與computeHorizontalScrollRange()和computeHorizontalScrollExtent()的單位一致。
缺省的偏移值為視圖滾動的偏移差值。
?????????????????? 返回值
??? ?????????????????? 滾動條滑塊在水平方向上的偏移值
?
protected int computeHorizontalScrollRange ()
scroll view 的可滾動水平范圍是所有子視圖的寬度總合。
?????????????????? 返回值
??? ?????????????????? 水平滾動條表示的全部水平滾動范圍
?
protected int computeScrollDeltaToGetChildRectOnScreen (Rect rect)
計算X方向滾動的總合,以便在屏幕上顯示子視圖的完整矩形(或者,若矩形寬度超過屏幕寬度,至少要填滿第一個屏幕大小)。
參數(shù)
rect ???????? 矩形
?????????????????? 返回值
??? ?????????????????? 滾動差值
?
protected float getLeftFadingEdgeStrength ()
返回左漸變邊緣的強度或密集度。強度的值介于0.0(無漸變)到1.0(全漸變)之間。缺省實現(xiàn)只返回0.0或1.0,而不返回中間值。子類必須重載次方法來給滾動動作提供更平滑的漸變過程。
?????????????????? 返回值
??? ?????????????????? 左漸變的強度,即介于0.0f和1.0f之間的浮點值
?
protected float getRightFadingEdgeStrength ()
返回右漸變邊緣的強度或密集度。強度的值介于0.0(無漸變)到1.0(全漸變)之間。缺省實現(xiàn)只返回0.0或1.0,而不返回中間值。子類必須重載此方法來給滾動動作提供更平滑的漸變過程。
?????????????????? 返回值
??? ?????????????????? 右漸變的強度,即介于0.0f和1.0f之間的浮點值
?
protected void measureChild (View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec)
要求子視圖測量自身,需要將視圖的MeasureSpec和其附加內(nèi)容同時考慮在內(nèi)。getChildMeasureSpec在其中承擔了重要角色,它計算出MeasureSpec,并傳遞給子視圖。
參數(shù)
child ??????? 要測量的子視圖
parentWidthMeasureSpec ??? 此視圖的寬度要求
parentHeightMeasureSpec ?? 此視圖的高度要求
?
protected void measureChildWithMargins (View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed)
要求子視圖測量自身,需要將視圖的MeasureSpec、附加內(nèi)容和邊緣部分同時考慮在內(nèi)。子項必須有MarginLayoutParams(邊緣布局參數(shù))。getChildMeasureSpec在其中承擔了重要角色,它計算出MeasureSpec,并傳遞給子視圖。
參數(shù)
child ??????? 要測量的子視圖
parentWidthMeasureSpec ??? 此視圖的寬度要求
widthUsed ????? 被父視圖(也可能是其他子視圖)占用的橫向額外空間
parentHeightMeasureSpec ?? 此視圖的高度要求
heightUsed ??? 被父視圖(也可能是其他子視圖)占用的縱向額外空間
?
protected void onLayout (boolean changed, int l, int t, int r, int b)
當此視圖要給每個子視圖賦值大小和位置時,layout會調(diào)用此方法。子項的派生類應當重載此方法,并且調(diào)用各個子項的layout。
參數(shù)
changed ????????? 此視圖有新的大小或位置
l ????? 左邊界位置,相對于父視圖
t ???? 上邊界位置,相對于父視圖
r ???? 右邊界位置,相對于父視圖
b ???? 下邊界位置,相對于父視圖
?
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
調(diào)用此方法來確定本身和所包含內(nèi)容的大?。▽挾群透叨龋4朔椒ū?/span>measure(int,int)喚起,而且必須被子類重載以得到所包含內(nèi)容的確切大小。
???????? 注意:當重載此方法時,必須調(diào)用setMeasureDimension(int,int)來保存View的大小。如果沒有做到,將會引發(fā)一個measure(int,int)拋出的IllegalStateException(非法狀態(tài)錯誤)。超類onMeasure(int,int)可以被調(diào)用。
???????? 編寫基類的確認大小的方法,缺省情況下是根據(jù)其背景大小來確認,除非MeasureSepc允許有更大的高度或?qū)挾?。子類必須重載onMeasure(int,int)以得到對其內(nèi)容大小的更準確的測量。
???????? 若此方法被重載,它的子類需要確保其高度和寬度至少達到View所規(guī)定的最小值(可通過getSuggestedMinimumHeight()和getSuggestedMinimumWidth()得到)。
參數(shù)
widthMeasureSpec ??????? 受上一層大小影響下的對水平空間的要求??蓞⒖?/span>View.MeasureSpec。
heightMeasureSpec ?????? 受上一層大小影響下的對垂直空間的要求??蓞⒖?/span>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ù)
scrollX ??? 新的X滾動像素值
scrollY ??? 新的Y滾動像素值
clampedX ?????? 當scrollX被over-scroll的邊界限制時,值為true
clampedY ?????? 當scrollY被over-scroll的邊界限制時,值為true
?
protected boolean onRequestFocusInDescendants (int direction, Rect previouslyFocusedRect)
當在某個scroll view的子視圖中尋找焦點時,需要小心不能讓屏幕之外的組件得到焦點。這比缺省ViewGroup的實現(xiàn)代價更高,否則此行為被設為缺省。
參數(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)
當View的大小改變時此方法被調(diào)用。如果View是剛剛被加入,則視之前的值為0。
參數(shù)
w ??? View的當前寬度
h ???? View的當前高度
oldw ?????? View大小改變之前的寬度
oldh ??????? View大小改變之前的高度
?
補充
文章精選
?Android HorizontalScrollview Example
?
?
?