Android View滚动、拉伸到顶/底部弹性回弹复位



《Android View滚动、拉伸到顶/底部弹性回弹复位》

我在上一篇文章介绍了如何实现一个Android ListView拉到顶/底部后,像橡皮筋一样弹性回弹复位(《Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位》,文章链接地址:
http://blog.csdn.net/zhangphil/article/details/47311155 )。事实上,Android凡是由ScrollView包裹的控件,均可实现滚动到顶/底部,弹性回弹复位的交互设计效果。关键点是重写Android原生ScrollView的overScrollBy()方法。

现给出实现代码和步骤:

(1)首先需要写一个View继承自ScrollView,然后重写关键的方法:overScrollBy()。假设该view就叫做ZhangPhilScrollView:

package zhangphil.view;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.widget.ScrollView;

public class ZhangPhilScrollView extends ScrollView{

	// 这个值控制可以把ScrollView包裹的控件拉出偏离顶部或底部的距离。
	private static final int MAX_OVERSCROLL_Y = 200;

	private Context mContext;
	private int newMaxOverScrollY;

	public ZhangPhilScrollView(Context context) {
		super(context);

		init(context);
	}

	public ZhangPhilScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);

		init(context);
	}

	/*
	 * public ZhangPhilListView(Context context, AttributeSet attrs, int
	 * defStyle) { super(context, attrs, defStyle); this.mContext = context;
	 * init(); }
	 */

	@SuppressLint("NewApi")
	private void init(Context context) {

		this.mContext = context;

		DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
		float density = metrics.density;
		newMaxOverScrollY = (int) (density * MAX_OVERSCROLL_Y);

		//false:隐藏ScrollView的滚动条。
		this.setVerticalScrollBarEnabled(false);

		//不管装载的控件填充的数据是否满屏,都允许橡皮筋一样的弹性回弹。
		this.setOverScrollMode(ScrollView.OVER_SCROLL_ALWAYS);
	}

	// 最关键的地方。
	//支持到SDK8需要增加@SuppressLint("NewApi")。
	@SuppressLint("NewApi")
	@Override
	protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,
			int scrollY, int scrollRangeX, int scrollRangeY,
			int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
		return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,
				scrollRangeX, scrollRangeY, maxOverScrollX, newMaxOverScrollY,
				isTouchEvent);
	}
}

(2)然后在布局文件代码中像使用Android原生的ScrollView一样使用ZhangPhilScrollView包裹需要实现弹性回弹交互设计的组件,在我的这个例子中,出于简单的目的,假设ZhangPhilScrollView包裹的只是一个TextView:

<zhangphil.view.ZhangPhilScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</zhangphil.view.ZhangPhilScrollView>

测试:

package zhangphil.view;

import zhangphil.view.R;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;
import android.graphics.Color;
import android.os.Bundle;

public class MainActivity extends ActionBarActivity {

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

		TextView text = (TextView) findViewById(R.id.text);

		// 测试数据集。
		String s = "";
		for (int i = 0; i < 10; i++) {
			s += i + "\n";
		}

		text.setText(s);

		// 设置TextView的背景颜色,更容易观察出弹性回弹效果。
		text.setBackgroundColor(Color.RED);
	}
}

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

时间: 2024-10-05 21:12:53

Android View滚动、拉伸到顶/底部弹性回弹复位的相关文章

Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位

 <Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位> Android本身的ListView拉到顶部或者底部会在顶部/底部边缘间隙出现一道"闪光"效果,暗示ListView已经到顶/底,不能再动了. 这是Android原生的ListView拉到顶部/底部的一种交互设计.交互设计的可选方案很多.Android 5.0将ListView的这个交互设计改变成"一片荡漾的光晕". 在众多的交互设计方案中,其中一种交互设计是这样的:当Li

Android View的滚动scroll

在View中: public void computeScroll() { //空实现 } public void scrollTo(int x,int y) {//view的(left,top)滚动到一个点(x,y) if (mScrollX != x ||mScrollY != y) { int oldX = mScrollX; int oldY = mScrollY; mScrollX = x; mScrollY = y; invalidateParentCaches(); onScrol

Android View中滚动相关

方法 scrollTo: (内容的左上角)达到某个地点 scrollBy: 根据当前位置,再移动多少 属性: mScrollX, 以下是文档解释 The offset, in pixels, by which the content of this view is scrolled horizontally. mScrollY, 以下是文档解释 The offset, in pixels, by which the content of this view is scrolled vertica

Android Scroller简单用法 --View滚动

转:http://ipjmc.iteye.com/blog/1615828 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(context).设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动.   相关API介绍如下 mScr

Android ScrollView 滚动机制

Android ScrollView 滚动机制 我们都知道通过View#scrollTo(x,y)既可以实现将View滚动的效果,如果再添加Scroller类,就可以实现滚到效果.但是,这背后是如何实现的呢?这个问题涉及到View的绘图机制.我们先看看View的绘图的基本流程 (图片来自于网上比较常见的view绘图流程图) 关于三个阶段的简单描述: 1. measure:预估计ViewTree的各个View的占用空间. 2. layout :   确定ViewTree中各个View所处的空间位置

android ScrollView判断滑动到底部的两种方式

package com.example.photowallfallsdemo; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL;

android View 详解

android.View.View(即View)类是以矩形的方式显示在屏幕上,View是用户界面控件的基础.View的继承层次关系如下图: 可以看到所有的界面控件都是View的子类.简单证实一下,每当你用findViewByIds(R.id.xx)时总要将其强转,因为该方法返回的是一个View实例,有木有!!!其中不得不提View的subClass ViewGroup.Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的.所有View的子类成为"Widget&

Android ScrollView滚动实现大众点评、网易云音乐评论悬停效果

今天听着网易云音乐,写着代码,真是爽翻了. http://blog.csdn.net/linshijun33/article/details/47910833 网易云音乐这个产品亮点应该在评论这一模块,于是我就去看了下评论区,发现一个它是用的一个ScrollView,从上到下可分为三部分.最上面是音乐封面.接着是精彩评论,然后是最新评论.手指在上面滚动一段距离.精彩评论就在布局顶部悬停,再接着滚动,最新评论就替代精彩评论在布局顶部悬停,十分有趣的一个特点. 然后又去翻了一下大众点评APP,发现也

Android Demo之旅 ListView底部添加加载更多按钮实现数据分页

在我们的实际项目中,数据应该说是很多的,我们的ListView不可能一下子把数据全部加载进来,我们可以当滚动条滚动到ListView的底部的时候,给一个更多的提示,当我们点击它即加载下一页的数据,相当与我们的分页效果,参考网上的东西,写了一个小小的demo,并总结了一些知识点,功能图如下:    源代码下载地址:http://download.csdn.net/detail/harderxin/7762625 掌握知识点: 1)自定义Adapter,将数据和ListView绑定起来 2)理解La