ScrollView
本质上是一个FrameLayout
,所以它只能为单一的控件提供滚动条,最常用子控件的是LinearLayout
。
TextView
也可以使用ScrollView
,但TextView
也提供了自带的滚动条的方法。
注意,不能对ListView
使用滚动条。
创建一个简单的ScrollView
可以在xml文件中定义一个ScrollView
控件,让它包含一个TextView
,如下:
<ScrollView
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</ScrollView>
为ScrollView设置监听器
通过为ScrollView
设置监听器,可以监听其是否滚动到最底部。
ScrollView
最常用的监听器是OnTouchListener
,它可以对多种手势动作进行响应,包括按下、滑动、离开等。
下面的例子中对ScrollView
的滑动动作进行了响应。
scrollView = (ScrollView) findViewById(R.id.scroll_view);
scrollView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_MOVE:
//滚动条位于顶部
if(scrollView.getScrollY() <= 0){
Log.d("MainActivity", "滚动条位于顶部");
}
//滚动条位于底部
if(scrollView.getChildAt(0).getMeasuredHeight() == scrollView.getHeight() + scrollView.getScrollY()){
Log.d("MainActivity", "滚动条位于底部");
Log.d("MainActivity", "getMeasuredHeight()=" + scrollView.getChildAt(0).getMeasuredHeight());
Log.d("MainActivity", "getHeight()=" + scrollView.getHeight());
Log.d("MainActivity", "getScrollY()=" + scrollView.getScrollY());
textView.append(getResources().getString(R.string.content_2));
}
}
return false;
}
});
}
上面的代码展示了如何判断滚动条位于顶部还是底部。其中包含了几个重要的方法:
- getMeasuredHeight()
:获得控件真实的高度,包括未显示部分的;
- getHeight()
:获得控件可见部分的高度;
- getScrollY()
:获得滚动条的垂直位置。
当滚动条位于最顶端的时候,getScrollY()
返回0;
当滚动条位于最底部的时候,有
scrollView.getChildAt(0).getMeasuredHeight() == scrollView.getHeight() + scrollView.getScrollY()
即真实高度=可见高度+滚动距离。这里要注意真实高度要使用TextView
的真实高度,而不能选择ScrollView
的真实高度,ScrollView
的真实高度和可见高度是一样的。所以这里要使用getChlildAt()
方法获取到ScrollView
的子控件,也就是TextView
。
ScrollTo()
和ScrollBy()
ScrollTo()
和ScrollBy()
都可是使滚动条滚动到指定的位置。二者都接受两个int型的整数作为参数,分别代表x轴和y轴坐标。不同之处是,ScrollTo()
的坐标是父容器的坐标为参考的,也就是“绝对位置”;而ScrollBy()
的坐标是以当前的坐标为参考的,相对当前的位置变动,也可以理解成”相对位置“。
例如,用两个按钮实现页面的滚动:
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn_up:
scrollView.scrollBy(0, -30);
break;
case R.id.btn_down:
scrollView.scrollBy(0, 30);
break;
}
}