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