使用ScrollView

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;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值