* ScrollView的滑动到 底部的监听,需要设置触摸监听。并且,需要去获取ScrollView的子控件的真实高度,已经,当前滑动的距离。已经控件在屏幕上显示的高度。
* ScrollView的scrollTo及ScrollViewBy方法的简单使用。
Demo很简单。首先是xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:id="@+id/down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="down" />
<Button
android:id="@+id/up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="up" />
<ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/wukong"
android:textSize="18sp" />
</ScrollView>
</LinearLayout>
以及String的xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">ScrollView</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="wukong">大闹天宫
孙悟空在第342岁时,因阳寿已尽而大闹地府,销毁关于他和世上的猴子猴孙的生死簿,返回
人间。阎王上报天庭,玉皇大帝欲捉拿悟空,太白金星建议招安。孙悟空被召上天宫,被骗封为弼马温,15日后知道原来这官是在养马,大怒,打出南天门。[4] 回花果山时,两个独角鬼王前来投奔,建议孙悟空自封“齐天大圣”。
玉皇大帝知道孙悟空反下天宫,命托塔天王李靖派兵镇压,孙悟空打败巨灵神、哪吒三太子,在太白金星的建议下,天庭封孙悟空为有名无实的齐天大圣并掌管蟠桃园。不料孙悟空桀骜不驯,反而偷吃蟠桃、偷喝仙酒、偷吃仙丹并扰乱蟠桃盛宴,玉帝震怒,命李靖率十万天兵天将带十八架天罗地网,去擒此妖猴,孙悟空打败九曜恶星,五个天王、哪吒三太子,使分身术战胜十万天兵,因为此战,孙悟空名扬天下。[5]
观音菩萨见孙悟空神通广大,推荐玉帝外甥显圣二郎真君去拿孙悟空。二郎神率部来到花果山,与孙悟空大战三百回合不分高下,随后二人均变化法相,大显神通。梅山六兄弟趁花果山后方空虚,放火烧山,孙悟空无心恋战,变化逃走,与二郎神大赌变化,经过一天苦战,观音欲用净瓶助二郎神擒拿孙悟空,被太上老君阻止,换金刚琢丢下,另外腿被二郎神的哮天犬咬了一口,于是被擒拿。[6]
孙悟空被擒,到斩妖台问斩,因先前偷吃了太上老君的金丹,变成金刚之躯[7] ,所以多种刑罚均无效,最后被太上老君带到兜率宫冶炼七七四十九天,然而适得其反让悟空练成一双火眼金睛。于是孙悟空蹬倒火炉,大闹天宫,使用金箍棒东打西敌,一时间无一神可挡。直至打到通明殿,与王灵官战到一处,佑圣真君派遣三十六员雷将围困孙悟空,正在争斗时,如来佛祖出现,孙悟空斗法失败,被压在五行山下。[8] </string>
</resources>
最后的Activity的代码:
package com.example.scrollview;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private ScrollView scrollView;
private TextView tv;
private Button up;
private Button down;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scrollView = (ScrollView) findViewById(R.id.scroll);
tv = (TextView) findViewById(R.id.tv);
final String text = getString(R.string.wukong);
up = (Button) findViewById(R.id.up);
down = (Button) findViewById(R.id.down);
up.setOnClickListener(this);
down.setOnClickListener(this);
scrollView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// 监听滑动到头部与底部
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE: {
/**
* 1.getScrollY()获取滑动的距离 <br>
* 2.getHeight()获取在屏幕上显示的高度 <br>
* 3.getMeasureHeight()获取控件的真实高度(包含屏幕外的高度) <br>
*/
if (scrollView.getScrollY() <= 0) {
// 说明没有滑动,在屏幕顶部
System.out.println("已经滑动到屏幕顶部");
}
// TODO: 获取ScrollView中包裹的View的高度!!!
int measuredHeight = scrollView.getChildAt(0)
.getMeasuredHeight();
int scrollY = scrollView.getScrollY();
int height = scrollView.getHeight();
if (measuredHeight <= scrollY + height) {
// 已经滑动的距离+在屏幕上显示的高度>=控件真实高度。说明已经滑动到底部
System.out.println("已经滑动到底部");
System.out
.println("measuredHeight=" + measuredHeight
+ " scrollY= " + scrollY + " height= "
+ height);
StringBuilder sb = new StringBuilder();
// tv.append(text);
String text2 = sb.append(text).toString();
tv.setText(text2);
}
break;
}
default:
break;
}
return false;
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.down:
// scrollView.scrollTo(0, 30);// 向下滑动30px,相对起始位置
scrollView.scrollBy(0, 50);// 相对上次位置,向下滑动30px
break;
case R.id.up:
// scrollView.scrollTo(0, -30);// 向上滑动30px,相对起始位置
scrollView.scrollBy(0, -50);// 向上滑动30px,相对上一次位置
break;
default:
break;
}
}
@Override
protected void onResume() {
if (sp == null)
sp = getSharedPreferences("sp.sp", MODE_PRIVATE);
int pos = sp.getInt("pos", 0);
System.out.println("onPause.pos: " + pos);
scrollView.scrollTo(0, pos);// 返回上次阅读的位置|没效果
super.onResume();
}
@Override
protected void onPause() {
if (scrollView != null) {
int scrollY = scrollView.getScrollY();
System.out.println("onPause.scrollY: " + scrollY);
if (sp == null)
sp = getSharedPreferences("sp.sp", MODE_PRIVATE);
sp.edit().putInt("pos", scrollY).commit();
}
super.onPause();
}
}