Android控件:ScrollView的使用,滑动到底部的监听

邹开畅
2023-12-01

* 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();
	}
}


 

代码运行OK,不过准备实现像小说阅读器那样。记录上次阅读位置,下次打开app自动找到上次位置的代码没有效果。但是整体不影响对ScrollView的简单使用。
 类似资料: