Android入门(35)——第十二章 使用ScrollView实现滚动效果

原创 2015年07月08日 16:56:47

1. 滚动视图是指拥有很多内容,屏幕显示不完,需要通过滚动来显示完整的视图。也就是右边的滚动条啦。

分两种:HorizontalScrollView:水平滚动视图。

ScrollView:垂直滚动视图。

2. 案例一:不使用ScrollView的情况:

第一步:在String.xml文件中增加content的长文本。代码略。

第二步:在main布局文件中添加一个TextView控件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
	<TextView 
	    android:id="@+id/content"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    />
	
</LinearLayout>
第三步:在活动MainActivity文件中显示内容:

package com.example.scrollview;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView tv;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        tv = (TextView) findViewById(R.id.content);
        // 括号里的这两个函数,都是系统自带的,用来获取资源的。这里获取了res中values中String文件中的内容。
        tv.setText(getResources().getString(R.string.content));
    }
    
}
效果图:这种情况下,由于TextView中内容太多一个屏幕无法显示,但是也无法滚动查看下面的内容。



3. 案例二:

那改变的方法呢超简单,只需要将main布局文件中的TextView控件放置在ScrollView控件中即可:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <ScrollView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/scroll"
        >
        
		<TextView 
		    android:id="@+id/content"
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    />
		
	</ScrollView>
</LinearLayout>

如果想要将右侧的滚动条隐藏,只需要给ScrollView控件添加属性:

android:scrollbars="none"
如果想要设置成横向的滚动效果,那么要将main布局文件中的ScrollView控件改成HorizontalScrollView即可:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <HorizontalScrollView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/scroll"
        android:scrollbars="none"
        >
        
		<TextView 
		    android:id="@+id/content"
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    />
		
	</HorizontalScrollView >
</LinearLayout>

效果图:这里只有一行啦:



4. 隐藏ScrollView滚动条:两种选一种就好了。


5. 监听ScrollView何时滑动到底部:

首先说一个点:getMeasuredHeight()包含了隐藏部分的高度。

第一步:在String.xml中添加xiaoxiao的追加文本信息。略

第二步:修改活动文件MainActivity,添加监听器:

package com.example.scrollview;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView tv;
	private ScrollView scroll;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		tv = (TextView) findViewById(R.id.content);
		// 括号里的这两个函数,都是系统自带的,用来获取资源的。这里获取了res中values中String文件中的内容。
		tv.setText(getResources().getString(R.string.content));
		scroll = (ScrollView) findViewById(R.id.scroll);
		scroll.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// 判断手势滑动
				switch (event.getAction()) {
				// 当手指抬起:
				case MotionEvent.ACTION_POINTER_UP:
					break;
				// 当手指落下:
				case MotionEvent.ACTION_DOWN:
					break;
				// 当手指在滑动:这个案例主要讨论滑动的这个手势,上两个不讨论了。
				case MotionEvent.ACTION_MOVE:
					/*
					 * (1)getScrollY()----滚动条滑动的距离,从0开始计算 
					 * (2)getMeasuredHeight()
					 * (3)getHeight()
					 */

					// 顶部状态
					if (scroll.getScaleY() <= 0) {
						Log.i("Main", "滑动到顶部");
					}

					// 底部状态
					// TextView的总高度 = 一屏幕的高度 + 滚动条滚动距离,关于这个表达式,老师用的是<=,难解
					if (scroll.getChildAt(0).getMeasuredHeight() > scroll.getHeight() + scroll.getScaleY()) {
						Log.i("Main", "滑动到底部");
						Log.i("Main",
								"scroll.getChildAt(0).getMeasuredHeight() = "
										+ scroll.getChildAt(0).getMeasuredHeight()
										+ "   scroll.getHeight() = "
										+ scroll.getHeight()
										+ "   scroll.getScaleY() = "
										+ scroll.getScaleY());
						// 追加文本。
						tv.append(getResources().getString(R.string.xiaoxiao));
					}

					break;
				default:
					break;
				}
				return false;
			}
		});
	}
}
效果图:如果一直在底部,那追加文字会不断追加。

文字在不断增加时,长度也在不断变化:


6. 控制ScrollView的视图位置:

第一步:在main布局文件中添加两个按钮:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <Button 
        android:id="@+id/up"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="UP"
        />
    
    <Button 
        android:id="@+id/down"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="DOWN"
        />
    
    <ScrollView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/scroll"
        android:scrollbars="none"
        >
        
		<TextView 
		    android:id="@+id/content"
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    />
		
	</ScrollView >
</LinearLayout>
第二步:在活动文件MainActivity中添加按钮点击事件:

package com.example.scrollview;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
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 TextView tv;
	private ScrollView scroll;
	private Button up_btn;
	private Button down_btn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		tv = (TextView) findViewById(R.id.content);
		// 括号里的这两个函数,都是系统自带的,用来获取资源的。这里获取了res中values中String文件中的内容。
		tv.setText(getResources().getString(R.string.content));
		
		up_btn = (Button) findViewById(R.id.up);
		down_btn = (Button) findViewById(R.id.down);
		up_btn.setOnClickListener(this);
		down_btn.setOnClickListener(this);
		
		scroll = (ScrollView) findViewById(R.id.scroll);
		scroll.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// 判断手势滑动
				switch (event.getAction()) {
				// 当手指抬起:
				case MotionEvent.ACTION_POINTER_UP:
					break;
				// 当手指落下:
				case MotionEvent.ACTION_DOWN:
					break;
				// 当手指在滑动:这个案例主要讨论滑动的这个手势,上两个不讨论了。
				case MotionEvent.ACTION_MOVE:
					/*
					 * (1)getScrollY()----滚动条滑动的距离,从0开始计算 (2)getMeasuredHeight()
					 * (3)getHeight()
					 */

					// 顶部状态
					if (scroll.getScaleY() <= 0) {
						Log.i("Main", "滑动到顶部");
					}

					// 底部状态
					// TextView的总高度 = 一屏幕的高度 + 滚动条滚动距离,关于这个表达式,老师用的是<=,难解
					if (scroll.getChildAt(0).getMeasuredHeight() > scroll
							.getHeight() + scroll.getScaleY()) {
						Log.i("Main", "滑动到底部");
						Log.i("Main",
								"scroll.getChildAt(0).getMeasuredHeight() = "
										+ scroll.getChildAt(0)
												.getMeasuredHeight()
										+ "   scroll.getHeight() = "
										+ scroll.getHeight()
										+ "   scroll.getScaleY() = "
										+ scroll.getScaleY());
						
						// 追加文本。
						tv.append(getResources().getString(R.string.xiaoxiao));
					}

					break;
				default:
					break;
				}
				return false;
			}
		});
	}

	@Override
	public void onClick(View arg0) {
		// scrollTo:参考系是滚动条的最开始的位置。效果也就是点一次以后第二次没有反应了。
		// scrollBy:相对前一次的位置去滚动对应的距离。
		/*
		 * 如果想实现像读小说一样返回来可以再次返回上次阅读的地方,
		 * 那么就可以通过保存上次的阅读位置,
		 * 然后返回后通过这些函数来实现滚动。
		 * */
		switch(arg0.getId()){
		case R.id.up:
			// 向上滚动30的距离。
			scroll.scrollBy(0, -30);
			break;
		case R.id.down:
			// 向下滚动30的距离。
			scroll.scrollBy(0, 30);
			break;
		}
	}
}
效果图:







版权声明:本文为博主原创文章,未经博主允许不得转载。

android标题栏颜色渐变效果的实现(标题栏随着scrollview的滚动而变化)

之前也是在网上看到这种效果,不过是滚动listview来改变标题栏的颜色,感觉那个应用的比较少,比如我要滚动scrollview来实现呢,那么问题就来了,废话少说,看一下要实现的效果先(这是在项目应用...

Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming),请尊重他人的辛勤劳动成果,谢谢! 随着移动互联网的快速发展,它已经和我们的生活息息相关...

Android - 小功能 - 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming),请尊重他人的辛勤劳动成果,谢谢! 随着移动互联网的快速发展,它已经和我们的生活息息相关了,...

Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

 随着移动互联网的快速发展,它已经和我们的生活息息相关了,在公交地铁里面都能看到很多人的人低头看着自己的手机屏幕,从此“低头族”一词就产生了,作为一名移动行业的开发人员,我自己也是一名“低头族”...

Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

分类: Android 高手进阶2013-12-20 09:04 14331人阅读 评论(38) 收藏 举报 android美团大众点评悬浮框 转帖请注明本文出自xiaanming的博...

Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果 转:http://blog.csdn.net/xiaanming/article/details/17374599...

Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming),请尊重他人的辛勤劳动成果,谢谢! 随着移动互联网的快速发展,它已经和我们的生活息息相关...

Android实现两个ScrollView互相联动,同步滚动的效果

公众号:smart_android 作者:loonggg 点击“阅读原文”,可查看更多内容和干货 最近在做一个项目,用到了两个ScrollView互相联动的效果,简单来说联动效果意思就是滑动...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android入门(35)——第十二章 使用ScrollView实现滚动效果
举报原因:
原因补充:

(最多只允许输入30个字)