我是靠谱客的博主 单身钢笔,这篇文章主要介绍Android布局控件之ScrollView(滚动视图),现在分享给大家,希望可以做个参考。

Android布局控件之ScrollView(滚动视图)

  1. 什么是ScrollView?它就是一个用于为普通组件添加滚动条的组件,一种可供用户滚动的层次结构布局容器,允许显示比实际多的内容。该组件里面最多只能包含一个组件,该组件在默认的情况下,只为其他组件添加垂直滚动条,如果要应用需要添加水平滚动条,则可以借助于另一个滚动视图-HorizontalScrollView来实现。
  2. 布局:
复制代码
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(滚动视图)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部