Android自定义控件(三)——有弹性的ListView
上一次我们试验了有弹性的ScrollView。详情
这一次,我们来试验有弹性的ScrollView。
国际惯例,效果图:
主要代码:
- import android.content.Context;
- import android.graphics.Rect;
- import android.util.AttributeSet;
- import android.view.MotionEvent;
- import android.view.animation.Animation;
- import android.view.animation.Animation.AnimationListener;
- import android.view.animation.TranslateAnimation;
- import android.widget.AbsListView;
- import android.widget.ListView;
- /**
- * ElasticScrollView有弹性的ListView
- */
- public class ElasticListView extends ListView {
- private float y;
- private Rect normal = new Rect();
- private boolean animationFinish = true;
- public ElasticListView(Context context) {
- super(context);
- init();
- }
- public ElasticListView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- protected void onScrollChanged(int l, int t, int oldl, int oldt) {
- }
- boolean overScrolled = false;
- private void init() {
- setOnScrollListener(new OnScrollListener() {
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- }
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
- overScrolled = false;
- }
- });
- }
- @Override
- protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
- overScrolled = true;
- }
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- commOnTouchEvent(ev);
- return super.onTouchEvent(ev);
- }
- public void commOnTouchEvent(MotionEvent ev) {
- if (animationFinish) {
- int action = ev.getAction();
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- y = ev.getY();
- break;
- case MotionEvent.ACTION_UP:
- y = 0;
- if (isNeedAnimation()) {
- animation();
- }
- break;
- case MotionEvent.ACTION_MOVE:
- final float preY = y == 0 ? ev.getY() : y;
- float nowY = ev.getY();
- int deltaY = (int) (preY - nowY);
- y = nowY;
- // 当滚动到最上或者最下时就不会再滚动,这时移动布局
- if (isNeedMove(deltaY)) {
- if (normal.isEmpty()) {
- // 保存正常的布局位置
- normal.set(getLeft(), getTop(), getRight(), getBottom());
- }
- // 移动布局
- layout(getLeft(), getTop() - deltaY / 2, getRight(), getBottom() - deltaY / 2);
- }
- break;
- default:
- break;
- }
- }
- }
- // 开启动画移动
- public void animation() {
- // 开启移动动画
- TranslateAnimation ta = new TranslateAnimation(0, 0, 0, normal.top - getTop());
- ta.setDuration(200);
- ta.setAnimationListener(new AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
- animationFinish = false;
- }
- @Override
- public void onAnimationRepeat(Animation animation) {
- }
- @Override
- public void onAnimationEnd(Animation animation) {
- clearAnimation();
- // 设置回到正常的布局位置
- layout(normal.left, normal.top, normal.right, normal.bottom);
- normal.setEmpty();
- animationFinish = true;
- }
- });
- startAnimation(ta);
- }
- // 是否需要开启动画
- public boolean isNeedAnimation() {
- return !normal.isEmpty();
- }
- // 是否需要移动布局
- public boolean isNeedMove(float deltaY) {
- if (overScrolled && getChildCount() > 0) {
- if (getLastVisiblePosition() == getCount() - 1 && deltaY > 0) {
- return true;
- }
- if (getFirstVisiblePosition() == 0 && deltaY < 0) {
- return true;
- }
- }
- return false;
- }
- }
测试代码:
- public class MainActivity extends Activity {
- ElasticListView listView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- listView = (ElasticListView) findViewById(R.id.listview);
- String[] listValues = new String[20];
- for (int i=0;i<listValues.length;i++) {
- listValues[i] = "TextView" + i;
- }
- listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listValues));
- }
- }
- public class MainActivity extends Activity {
- ElasticListView listView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- listView = (ElasticListView) findViewById(R.id.listview);
- String[] listValues = new String[20];
- for (int i=0;i<listValues.length;i++) {
- listValues[i] = "TextView" + i;
- }
- listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listValues));
- }
- }
Android自定义控件(三)——有弹性的ListView的更多相关文章
- 老猪带你玩转android自定义控件二——自定义索引栏listview
带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个 ...
- 玩转android自定义控件二——自定义索引栏listview
带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个 ...
- Android自定义控件三种方式
1.组合原生控件(继承自ViewGroup.LinearLayout.FrameLayout.RelativeLayout等) 将原生空间做组合,自定义一些事件 2.自己绘制控件(继承自View) ...
- android自定义控件(三) 自定义属性
书接上回 在xml里建立属性,然后java代码里用typedArray获得这些属性,得到属性后,利用属性做一些事.例:得到xml里的color,赋给paint. 1.在res/values/下新建at ...
- android自定义控件(三) 增加内容 自定义属性 format详解
转自 http://www.gisall.com/html/35/160435-5369.html 1. reference:参考某一资源ID. (1)属性定义: <declare-stylea ...
- 【转】Android自定义控件(三)——有弹性的ListView
原文地址:http://blog.csdn.net/a105865708/article/details/17959459 上一次我们试验了有弹性的ScrollView.详情 这一次,我们来试验有弹性 ...
- Android自定义控件——有弹性的ListView,ScrollView
上一次我们试验了有弹性的ScrollView.详情 这一次,我们来试验有弹性的ScrollView. 国际惯例,效果图: 主要代码: [java] view plaincopy import andr ...
- Android自定义控件(四)——让每一个Activity UI都具有弹性
前面我们已经介绍了如何让你的ScrollView,ListView具有弹性, 今天,我们在前面的基础上,做一下适当的修改,让那些既不是ScrollView,也不是ListView的Activity页面 ...
- Android自定义控件之自定义组合控件(三)
前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...
随机推荐
- Linux字符设备中的两个重要结构体(file、inode)
对于Linux系统中,一般字符设备和驱动之间的函数调用关系如下图所示 上图描述了用户空间应用程序通过系统调用来调用程序的过程.一般而言在驱动程序的设计中,会关系 struct file 和 struc ...
- chmod
0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限数字与字符对应关系如下:r=4,w=2,x=1若要rwx属性则4+2+1=7若要rw-属性则4+2=6:若要r-x属性则4+1=5命令: ...
- Web文件管理:elFinder.Net(支持FTP)
elFinder 是一个基于 Web 的文件管理器,灵感来自 Mac OS X 的 Finder 程序. elFinder.Net是.Net版本的一个Demo,使用ASP.NET MVC 4集成,可以 ...
- Sql Server添加用户
1.sa用户登陆之后,在安全性中新建登录名 2.添加登录名,下面的默认数据库选择该用户可访问的默认数据库 3.服务器角色中选择public 4.用户映射中选择该用户可访问的数据库,数据库角色一般选择p ...
- 设置cas server使用http非安全协议
目录 1.tomcat添加https安全协议 2.下载cas server端部署到tomcat上 3.CAS服务器深入配置(连接MYSQL) 4.Apache Shiro 集成Cas作为cas cli ...
- javascript改变背景/字体颜色(Through the javascript to change the background and font color)
鼠标移动到.移出DIV时修改DIV的颜色: 1.Change the font and Div background color--function <div style="width ...
- spring的定时任务或者说自动任务
http://kevin19900306.iteye.com/blog/1397744 //这个是别人的博客 引入除spring.jar外的Quartz的jar包quartz-all-1.8. ...
- (翻译玩)SQLALchemy backref章节文档
Linking Relationships with Backref 自从在Object Relational Tutorial中第一次提到backref参数后,许多案例中也用到了backref,那么 ...
- C 小写字母编程大写并输出
main(){ FILE *fp; char str[100],filename[10]; int i=0;if((fp=fopen("test","w"))= ...
- SDWebImage使用——一个可管理远程图片加载的类库
SDWebImage使用——一个可管理远程图片加载的类库 SDWebImage使用——一个可管理远程图片加载的类库 SDWebImage托管在github上.https://github.co ...