ScrollView 监听当前的高度改变

来源:互联网 发布:uc聊天软件下载 编辑:程序博客网 时间:2024/05/21 14:57

最近在使用ScrollView的时候遇到一些问题。查看API我们很容易发现使用ScrollView的scrollTo(x, y)很容易的使ScrollView定位到某个位置。
但是如果我在ScrollView中包含了一个TextView对象,我通过getScrollY()的方法取得了当前的高度,并保存了位置。后面就可以使用scrollTo(x, y)定位了。似乎一切都没有问题。但是,我如果允许用户设定TextView里面的文字大小的话,当TextView包含的内容很长的话,你原先保存的位置和能已经差的很远了。

这时我们似乎需要一个百分比的位置来解决这个问题。但Google似乎认为现有的方法已经够了,你们不可能有这么“复杂”的要求。无奈啊!

既然没有就自己想办法啦, 简单一看,发现ScrollView的对象有一个computeVerticalScrollRange() 方法, 当然这个方法是protected的,你是没有办法直接调用的。这就简单了,创建一个类继承ScrollView, 新建一个方法,把这个方法设置成public的,在里面调用computeVerticalScrollRange(), 一切问题都解决了。

?
code
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
40
41
42
43
package com.aoandroid.scrollviewdemo;
  
  
  
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;
  
public class AOAScrollView extendsScrollView {
  
    privateScrollViewListener scrollViewListener = null;
  
  
    publicAOAScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
  
    publicAOAScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
  
    publicAOAScrollView(Context context) {
        super(context);
    }
  
    publicvoid setScrollViewListener(ScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }
  
    @Override
    protectedvoid onScrollChanged(intx, int y, int oldx, int oldy) {
        super.onScrollChanged(x, y, oldx, oldy);
        if(scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
        }
    }
      
    publicint getTotalVerticalScrollRange() {
        returncomputeVerticalScrollRange();
    }
      
      
}

这时,getTotalVerticalScrollRange()就可以计算出当前总的高度,再结合getScrollY(), 就可以计算出高度的百分比。改变文字大小的时候, 取到新的总高度,乘以百分比就可以定位到原先的位置了。

当然, xml里面就要这么调用了

?
code
1
2
3
4
5
6
7
<com.aoandroid.scrollviewdemo.AOAScrollView
        android:id="@+id/ScrollView"android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextViewandroid:id="@+id/contentTV"android:textColor="#000000"android:textSize="28dip"
            android:layout_width="fill_parent"android:layout_height="wrap_content"
            android:text=""/>
</com.aoandroid.scrollviewdemo.AOAScrollView>

附件是一个实例代码。里面还包含了一个ScrollView改变的时候的监听动作, 如果你要在用户拉多ScrollView作出额外动作的时候,可以参考。
创建一个Listener

?
code
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
40
41
42
package com.aoandroid.scrollviewdemo;
  
public interface ScrollViewListener {
    voidonScrollChanged(AOAScrollView scrollView, intx, int y, int oldx, int oldy);
}
  
  
  
把Listener和AOAScrollView绑定
  
  
packagecom.aoandroid.scrollviewdemo;
  
  
  
  
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
  
public class HomeActivity extendsActivity implementsScrollViewListener {
    AOAScrollView scrollView =null;
          
    publicvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
          
        TextView tv = (TextView)this.findViewById(R.id.contentTV);
        tv.setText(R.string.content);
  
        scrollView = (AOAScrollView)this.findViewById(R.id.ScrollView);
        scrollView.setScrollViewListener(this);
    }
  
    @Override
    publicvoid onScrollChanged(AOAScrollView scrollView,int x, inty, int oldx, int oldy) {
        // TODO Auto-generated method stub
        Log.i("HomeActivity","AOAScrollView Position x, y, oldx, oldy : "+ x + " , " + y + " , " + oldx +" , " + oldy + " total height=" + scrollView.getTotalVerticalScrollRange());
              
原创粉丝点击