最近在使用ScrollView的时候遇到一些问题。查看API我们很容易发现使用ScrollView的scrollTo(x, y)很容易的使ScrollView定位到某个位置。
但是如果我在ScrollView中包含了一个TextView对象,我通过getScrollY()的方法取得了当前的高度,并保存了位置。后面就可以使用scrollTo(x, y)定位了。似乎一切都没有问题。但是,我如果允许用户设定TextView里面的文字大小的话,当TextView包含的内容很长的话,你原先保存的位置和能已经差的很远了。
这时我们似乎需要一个百分比的位置来解决这个问题。但Google似乎认为现有的方法已经够了,你们不可能有这么“复杂”的要求。无奈啊!
既然没有就自己想办法啦, 简单一看,发现ScrollView的对象有一个computeVerticalScrollRange() 方法, 当然这个方法是protected的,你是没有办法直接调用的。这就简单了,创建一个类继承ScrollView, 新建一个方法,把这个方法设置成public的,在里面调用computeVerticalScrollRange(), 一切问题都解决了。
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里面就要这么调用了
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
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());
|