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")@Overrideprotected 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" ><TextViewandroid: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 {@Overrideprotected 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);}
}
Android View滚动、拉伸到顶/底部弹性回弹复位相关推荐
- android 底部回弹,Android View滚动、拉伸到顶/底部弹性回弹复位
<Android View滚动.拉伸到顶/底部弹性回弹复位> 我在上一篇文章介绍了如何实现一个Android ListView拉到顶/底部后,像橡皮筋一样弹性回弹复位(<And ...
- android 球形进度,android仿360手机卫士的自定义波浪球形进度View 滚动痕迹
先看问题效果图: 那个球星水波纹是个自定义view,代码如下 import com.jinsheng.R; import com.jinsheng.util.MyUtil; import androi ...
- Android 上下滚动字幕实现
首先values文件夹下添加或创建attrs文件,如下: <?xml version="1.0" encoding="utf-8"?> <re ...
- android view z总结的好帖子
http://www.cnblogs.com/hawkon/p/3593709.html 转自:http://blog.csdn.net/shulianghan/article/details/180 ...
- Android滑动页面 底部小圆点,Android ViewPager无限循环实现底部小圆点动态滑动
页面拖动到最后一页 再向下滑动回复到 第一页,第一页向前滑动回到 最后一页 同时,底部红色小圆点随着页面的滑动距离比例随时改变位置 布局: xmlns:android="http://sch ...
- Android 上下滚动的广告条
有些应用里面会有一些上下滚动文字的广告,尤其是关于商城里面的容易出现,具体的效果相比大家也见过,先看看效果吧 这是怎么实现的呢,有人说是用TextView实现,有的说这是跑马灯效果.其实说TextVi ...
- 【Android View事件分发机制】滑动冲突
View内容滑动概念 scrollTo scrollBy scrollTo(x,y) x,y 是绝对值,如果x,y不变,重复调用是不会移动的. scrollBy(x,y) x,y是增量之,每次调用都会 ...
- 【Android View绘制之旅】Layout过程
1.为什么要进行Layout? 在[Android View绘制之旅]View之测量Measure过程后,View我们得到View的宽高,但光只有宽高值是不足以反映视图的,更需要知道View所在的位置 ...
- 监听ListView滚动到最底部
监听ListView滚动到最底部 监听ListView的滚动可以用两个东西: ListView.onScrollStateChanged (本文讲解这个listener的使用) 在OnGestureL ...
最新文章
- C#操作SQLite 报错 (Attempt to write a read-only database)
- 软件使用说明书模板_想要快速定制表单模板?请收下这份浩辰3D设计攻略
- /usr/bin/ld: cannot find -lmysqlclient_r
- Toast的另类应用及另类“拦截”Home键
- 网游类似魔兽世界的服务器维护都是在干嘛?
- 【PAT甲级 排序】1012 The Best Rank (25 分) C++ 全部AC
- [C++] Pure Virtual Function and Abstract Class
- 【python问题系列--4】ValueError: operands could not be broadcast together with shapes (100,3) (3,1)...
- ios 进入后台 一段时间在进入前台 动画消失
- zul使用java_java – 从Jar加载ZUL
- 从零到百亿互网融构展
- WIN间远程桌面连接:你的凭据不工作解决(亲测有效)
- 微信小游戏和微信小程序的区别与共同
- Arduino基础入门篇26—步进电机
- 苹果app商品定价_苹果将调整应用商店定价:中国区应用最低价涨至8元
- mysql 替换 斜杠_Mysql like查询语句中,结果包含反斜杠 \ 字符的,需要替换成四个反斜杠 \\\\...
- Redhat最小化安装后安装图形界面步骤
- 点击劫持漏洞修复(前端、后端)
- python 代码合并txt文件
- JAVA实现简易的图书管理系统(含过程)
热门文章
- c语言switch为什么要加break,c语言学习笔记 switch case语句为什么要加break
- linux svn cleanup 用法,SVN命令之清理命令(clean up)的功能及使用技巧
- 文件I0通用的IO模型
- mysql 学习笔记08 日期相关函数2
- 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
- 1074. Reversing Linked List (25)
- html5跨平台桌面打包,Html5到跨平台app应用
- k8s的ingress使用
- 微信公众号接入开发者模式,服务器配置Token验证
- Maven Web项目解决跨域问题