Android布局控件之ScrollView(滚动视图)
- 什么是ScrollView?它就是一个用于为普通组件添加滚动条的组件,一种可供用户滚动的层次结构布局容器,允许显示比实际多的内容。该组件里面最多只能包含一个组件,该组件在默认的情况下,只为其他组件添加垂直滚动条,如果要应用需要添加水平滚动条,则可以借助于另一个滚动视图-HorizontalScrollView来实现。
- 布局:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mScro"
>
<LinearLayout
android:id="@+id/mLinear"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:id="@+id/mTv"
android:onClick="onClick"//添加一个点击事件
android:layout_width="match_parent"
android:layout_height="100dp"
android:text="aaaaaaaa"
android:gravity="center"
android:textSize="20sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:text="aaaaaaaa"
android:gravity="center"
android:textSize="40sp"/>
.
.
.
.
.
n-1
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:text="aaaaaaaa"
android:gravity="center"
android:textSize="40sp"/>
</LinearLayout>
</ScrollView>
以上布局,是一个简单的示例布局,通过代码来掌握ScrollView的基本使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class MainActivity extends AppCompatActivity {
private ScrollView mScro;
private LinearLayout mLinear;
private TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.scrollview);
mScro = (ScrollView)findViewById(R.id.mScro);
mLinear = (LinearLayout)findViewById(R.id.mLinear);
mTv = (TextView)findViewById(R.id.mTv);
}
public void onClick(View view){
switch (view.getId()){
case R.id.mTv:
int mScroHeight = mScro.getHeight();
int mScroWidth = mScro.getWidth();
mTv.setText("高度为:" + mScroHeight + "宽度为:" + mScroWidth);
break;
case R.id.mLinear:
// mScro.scrollTo(0,1000);//滚动时候是瞬间滚动过去
// mScro.scrollBy(0,1000);//滚动时候是瞬间的,设置偏移量,在当前的位置基础上偏移设置的数值
// mScro.smoothScrollTo(0,1000);//滚动时候是平缓的而不是立即滚动到某处
// mScro.smoothScrollBy(0,100);//滚动时候是平缓,在当前的位置基础上偏移设置的数值
break;
}
}
}
其他方法如下:
public void addView (View child)
1
2
3添加子视图。如果事先没有给子视图设置layout参数,会采用当前ViewGroup的默认参数来设置子视图。 参数:child 所添加的子视图
public void addView (View child, int index)
1
2
3
4添加子视图。如果事先没有给子视图设置layout参数,会采用当前ViewGroup的默认参数来设置子视图。 参数:child 所添加的子视图 index 添加子视图的位置
public void addView (View child, int index, ViewGroup.LayoutParams params)
1
2
3
4
5
6
7
8
9
10根据指定的layout参数添加子视图 参数 child 所添加的子视图 index 添加子视图的位置 params 为子视图设置的layout参数
public void addView (View child, ViewGroup.LayoutParams params)
1
2
3
4
5
6
7
8根据指定的layout参数添加子视图。 参数 child 所添加的子视图 params 为子视图设置的layout参数
public boolean arrowScroll (int direction)
1
2
3
4
5
6
7
8
9
10响应点击上下箭头时对滚动条滚动的处理。 参数: direction 按下的箭头所对应的方向 返回值: 如果我们处理(消耗)了此事件返回true,否则返回false。
public void computeScroll ()
1
2被父视图调用,用于必要时候对其子视图的值(mScrollX和mScrollY)进行更新。典型的情况如:父视图中某个子视图使用一个Scroller对象来实现滚动操作,会使得此方法被调用。
public boolean dispatchKeyEvent (KeyEvent event)
1
2
3
4
5
6
7
8
9
10发送一个key事件给当前焦点路径的下一个视图。此焦点路径从视图树的顶层执行直到当前焦点视图。如果此视图为焦点视图,将为自己发送。否则,会为当前焦点路径的下一个节点发送。此方法也会激起一个key监听器。 参数: event 发送的key事件 返回值: 事件被处理返回true,否则返回false。
public void draw (Canvas canvas)
1
2
3
4手动绘制视图(及其子视图)到指定的画布(Canvas)。这个视图必须在调用这个函数之前做好了整体布局。当实现一个视图时,不需要继承这个方法;相反,你应该实现onDraw(Canvas)方法。 参数 canvas 绘制视图的画布
public boolean executeKeyEvent (KeyEvent event)
1
2
3
4
5
6
7
8
9
10当接收到key事件时,用户可以调用此函数来使滚动视图执行滚动,类似于处理由视图体系发送的事件。 参数: event 需要执行key的事件 返回值: 事件被处理返回true,否则返回false。
public void fling (int velocityY)
1
2
3
4
5
6滚动视图的滑动(fling)手势。(译者注: 如何监听android的屏幕滑动停止事件) 参数 velocityY Y方向的初始速率。正值表示手指/光标向屏幕下方滑动,而内容将向上滚动。
public boolean fullScroll (int direction)
1
2
3
4
5
6
7
8
9
10对响应“home/end”短按时响应滚动处理。此方法将视图滚动到顶部或者底部,并且将焦点置于新的可视区域的最顶部/最底部组件。若没有适合的组件做焦点,当前的ScrollView会收回焦点。 参数: direction 滚动方向:FOCUS_UP表示视图向上滚动;FOCUS_DOWN表示视图向下滚动 返回值: 若key事件被消耗(consumed)返回true,其他情况返回false。
public int getMaxScrollAmount ()
1
2
3
4返回值 当前滚动视图响应箭头事件能够滚动的最大数。
public boolean isFillViewport ()
1
2
3
4
5
6指示当前ScrollView的内容是否被拉伸以填充视图可视范围(译者注:viewport可视范围,参见决定Scrollviewer里面Control的可视范围)。 返回值 内容填充视图返回true,否则返回false。
public boolean isSmoothScrollingEnabled ()
1
2
3
4返回值 按箭头方向滚动时,是否显示滚动的平滑效果。
public boolean onInterceptTouchEvent (MotionEvent ev)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20实现此方法是为了拦截所有触摸屏幕时的运动事件。可以像处理发送给子视图的事件一样去监视这些事件,并且获取当前手势在任意点的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 体系向下发送的动作事件 返回值 如果将运动事件从子视图中截获并且通过onTouchEvent()发送到当前ViewGroup ,返回true。当前目标将会收到ACTION_CANCEL事件,并且不再会有其他消息传递到此。
public boolean onTouchEvent (MotionEvent ev)
1
2
3
4
5
6
7
8
9
10执行此方法为了处理触摸屏幕的运动事件。 参数 ev 运动事件 返回值 事件被处理返回true,其它返回false。
public boolean pageScroll (int direction)
1
2
3
4
5
6
7
8
9
10响应短按“page up/ down”时候对滚动的处理。此方法将向上或者向下滚动一屏,并且将焦点置于新可视区域的最上/最下。如果没有适合的component作为焦点,当前scrollView将收回焦点。 参数 direction 滚动方向:FOCUS_UP表示向上翻一页,FOCUS_DOWN表示向下翻一页。 返回值 此key事件被消耗(cosumed)返回true,其他返回false。
public void requestChildFocus (View child, View focused)
1
2
3
4
5
6
7
8当父视图的一个子视图的要获得焦点时,调用此方法。 参数 child 要获得焦点的父视图的子视图。此视图包含了焦点视图。如果没有特殊徐要求,此视图实际上就是焦点视图。 focused 子视图的子孙视图并且此子孙视图是真正的焦点视图
public boolean requestChildRectangleOnScreen (View child, Rect rectangle, boolean immediate)
1
2
3
4
5
6
7
8
9
10
11
12
13当组里的某个子视图需要被定位在屏幕的某个矩形范围时,调用此方法。重载此方法的ViewGroup可确认以下几点: * 子项目将是组里的直系子项 * 矩形将在子项目的坐标体系中 重载此方法的ViewGroup应该支持以下几点: * 若矩形已经是可见的,则没有东西会改变 * 为使矩形区域全部可见,视图将可以被滚动显示 参数 child 发出请求的子视图 rectangle 子项目坐标系内的矩形,即此子项目希望在屏幕上的定位 immediate 设为true,则禁止动画和平滑移动滚动条 返回值 进行了滚动操作的这个组(group),是否处理此操作。
public void requestLayout ()
1
2当有改变引起当前视图重新布局时,调用此函数。它将规划一个视图树的layout路径。
public void scrollTo (int x, int y)
1
2
3
4
5
6
7
8
9
10设置当前视图滚动到的位置。此函数会引起对onScrollChanged(int, int, int, int)函数的调用并且会让视图更新。 当前版本取消了在子视图中的滚动。 参数 x 滚动到的X位置 y 滚动到的Y位置
public void setFillViewport (boolean fillViewport)
1
2
3
4
5
6设置当前滚动视图是否将内容高度拉伸以填充视图可视范围(译者注:viewport可视范围,参见决定Scrollviewer里面Control的可视范围)。 参数 fillViewport 设置为true表示拉伸内容高度来适应视口边界;其他设为false。
public void setOverScrollMode (int mode)
1
2
3
4
5为视图设置over-scroll模式。有效的over-scroll模式有OVER_SCROLL_ALWAYS(缺省值),OVER_SCROLL_IF_CONTENT_SCROLLS(只允许当视图内容大过容器时,进行over-scrolling)和OVER_SCROLL_NEVER。只有当视图可以滚动时,此项设置才起作用。 参数 mode The new over-scroll mode for this view.
public void setSmoothScrollingEnabled (boolean smoothScrollingEnabled)
1
2
3
4
5
6用来设置箭头滚动是否可以引发视图滚动。 参数 smoothScrollingEnabled 设置箭头滚动是否可以引起内容的滚动的bool值
public final void smoothScrollBy (int dx, int dy)
1
2
3
4
5
6
7
8类似于scrollBy(int, int),但是滚动时候是平缓的而不是立即滚动到某处。 参数 dx 在X方向滚动的像素数 dy 在Y方向滚动的像素数
public final void smoothScrollTo (int x, int y)
1
2
3
4
5
6
7
8类似于scrollTo(int, int),但是滚动时候是平缓的而不是立即滚动到某处。 参数 x 要滚动到位置的X坐标 y 要滚动到位置的Y坐标
protected int computeScrollDeltaToGetChildRectOnScreen (Rect rect)
1
2
3
4
5
6
7
8
9
10计算X方向滚动的总合,以便在屏幕上显示子视图的完整矩形(或者,若矩形宽度超过屏幕宽度,至少要填满第一个屏幕大小)。 参数 rect 矩形 返回值 滚动差值
protected int computeVerticalScrollOffset ()
1
2
3
4
5
6
7
8
9
10计算垂直方向滚动条的滑块的偏移。此值用来计算滚动条轨迹的滑块的位置。 范围可以以任意单位表示,但是必须与computeVerticalScrollRange()和computeVerticalScrollExtent()的单位一致。 缺省的偏移是在当前视图滚动的偏移。 返回值 滚动条的滑块垂直方向的偏移。
protected int computeVerticalScrollRange ()
1
2
3
4
5
6滚动视图的可滚动范围是所有子元素的高度。 返回值 由垂直方向滚动条代表的所有垂直范围,缺省的范围是当前视图的画图高度。
protected float getBottomFadingEdgeStrength ()
1
2
3
4
5
6返回滚动底部的能见度。能见度的值的范围是0.0(没有消失)到1.0(完全消失)之间。缺省的执行返回值为0.0或者1.0,而不是他们中间的某个值。滚动时子类需要重载这个方法来提供一个平缓的渐隐的实现。 返回值 滚动底部能见度,值的范围在浮点数0.0f到1.0f之间。
protected float getTopFadingEdgeStrength ()
1
2
3
4
5
6返回滚动顶部的能见度。能见度的值的范围是0.0(没有消失)到1.0(完全消失)之间。缺省的执行返回值为0.0或者1.0,而不是他们中间的某个值。滚动时子类需要重载这个方法来提供一个平缓的渐隐的实现。 返回值 滚动顶部能见度,值的范围在浮点数0.0f到1.0f之间。
protected void measureChild (View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec)
1
2
3
4
5
6
7
8
9
10要求当前视图的一个子视图测量自己,同时兼顾到当前视图的MeasureSpec的要求和它的空白。子视图必须有MarginLayoutParams。比较复杂的工作是在getChildMeasureSpec中完成的。 参数 child 需要自己测量的子视图 parentWidthMeasureSpec 当前视图要求的宽度 parentHeightMeasureSpec 当前视图要求的宽度
protected void measureChildWithMargins (View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed)
1
2
3
4
5
6
7
8
9
10
11
12
13
14要求当前视图的一个子视图测量自己,同时兼顾到当前视图的MeasureSpec的要求和它的空白和边界。子视图必须有MarginLayoutParams。比较复杂的工作是在getChildMeasureSpec中完成的。 参数 child 需要测量的子视图 parentWidthMeasureSpec 当前视图要求的宽度 widthUsed 水平方向上由父视图使用的空白 (也可能是视图的其他子视图使用的) parentHeightMeasureSpec 当前视图要求的宽度 heightUsed 垂直方向上由父视图使用的空白 (也可能是视图的其他子视图使用的)
protected void onLayout (boolean changed, int l, int t, int r, int b)
1
2
3
4
5
6
7
8
9
10
11
12
13
14当前视图需要为子视图分配大小和位置时候调用,子类继承必须要重载此方法并调用自己子视图的layout函数。 参数 changed 当前视图的新的大小或者位置 l 相对父视图,左边界位置 t 相对父视图,上边界位置 r 相对父视图,右边界位置 b 相对父视图,下边界位置
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14测量视图以确定其内容宽度和高度。此方法被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)
1
2
3
4
5
6
7
8
9
10
11
12被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)
1
2
3
4
5
6当在滚动视图的子视图中查找焦点视图时,需要注意不要将焦点设置在滚动出屏幕外的控件上。此方法会比执行缺省的ViewGroup代价高,否则此行为也会设置为缺省 参数 direction 指定下列常量之一:FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT
protected void onSizeChanged (int w, int h, int oldw, int oldh)
1
2
3
4
5
6
7
8
9
10
11
12布局期间当视图的大小发生改变时调用。如果只是添加到视图,调用时显示的是旧值0。(译者注:也就是添加到视图时,oldw和oldh返回的是0)。 参数 w 视图当前宽度 h 视图当前高度 oldw 视图改变前的宽度 oldh 视图改变前的高度
最后
以上就是单身钢笔最近收集整理的关于Android布局控件之ScrollView(滚动视图)的全部内容,更多相关Android布局控件之ScrollView(滚动视图)内容请搜索靠谱客的其他文章。
发表评论 取消回复