ScrollView 监听当前的高度改变

最近在使用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 extends ScrollView {
  
     private ScrollViewListener scrollViewListener = null ;
  
  
     public AOAScrollView(Context context, AttributeSet attrs, int defStyle) {
         super (context, attrs, defStyle);
     }
  
     public AOAScrollView(Context context, AttributeSet attrs) {
         super (context, attrs);
     }
  
     public AOAScrollView(Context context) {
         super (context);
     }
  
     public void setScrollViewListener(ScrollViewListener scrollViewListener) {
         this .scrollViewListener = scrollViewListener;
     }
  
     @Override
     protected void onScrollChanged( int x, int y, int oldx, int oldy) {
         super .onScrollChanged(x, y, oldx, oldy);
         if (scrollViewListener != null ) {
             scrollViewListener.onScrollChanged( this , x, y, oldx, oldy);
         }
     }
      
     public int getTotalVerticalScrollRange() {
         return computeVerticalScrollRange();
     }
      
      
}

这时,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" >
         < TextView android: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 {
     void onScrollChanged(AOAScrollView scrollView, int x, int y, int oldx, int oldy);
}
  
  
  
把Listener和AOAScrollView绑定
  
  
package com.aoandroid.scrollviewdemo;
  
  
  
  
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
  
public class HomeActivity extends Activity implements ScrollViewListener {
     AOAScrollView scrollView = null ;
          
     public void 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
     public void onScrollChanged(AOAScrollView scrollView, int x, int y, 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());
              

猜你喜欢

转载自blog.csdn.net/xujie9055/article/details/9465927