ListView反弹

package com.rebound.myscroll;

import android.content.Context;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.view.animation.Animation;

import android.view.animation.Animation.AnimationListener;

import android.view.animation.LinearInterpolator;

import android.view.animation.TranslateAnimation;

import android.widget.LinearLayout;

import android.widget.ListView;

/**

* listView反弹

*

*/

public class ListViewFantan extends LinearLayout {

private float y_down;

public ListViewFantan(Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

float y2 = ev.getY();

float y_move = 0;

switch (ev.getAction()) {

case MotionEvent.ACTION_DOWN:

y_down = y2;

break;

case MotionEvent.ACTION_MOVE:

y_move = y2 - y_down;

break;

case MotionEvent.ACTION_UP:

y_move = y2 - y_down;

break;

default:

break;

}

// listview到顶了,顶部反弹

if (listView != null && y_move > 0

&& listView.getFirstVisiblePosition() == 0) {

View childAt = listView.getChildAt(0);

if (childAt != null && childAt.getTop() == 0) {

move_top = true;

move_bottom = false;

return true;// 自己处理

}

}

// listview到底了,底部反弹

if (listView != null) {

// listView.

View childAt = listView.getChildAt(listView.getChildCount() - 1);

if (childAt != null) {

int top = childAt.getTop();

int bottom = childAt.getBottom();

int height = getHeight();

System.out.println("bottom:" + bottom + "height:" + height);

if (bottom <= height && y_move < 0) {

move_bottom = true;

move_top = false;

// 到底了

return true;// 自己处理

}

}

}

return false;

}

/**

* 向上移动(顶部反弹)

*/

private boolean move_top;

/**

* 向下移动(底部反弹)

*/

private boolean move_bottom;

@Override

public boolean onTouchEvent(MotionEvent ev) {

float y2 = ev.getY();

float y_move = 0;

switch (ev.getAction()) {

case MotionEvent.ACTION_DOWN:

y_down = y2;

//System.out.println("down:" + y_down);

break;

case MotionEvent.ACTION_MOVE:

y_move = y2 - y_down;

//System.out.println("move:" + y_move);

if (move_top) {

//顶部反弹

this.setPadding(0, (int) y_move, 0, 0);

//System.out.println("padding_top:" + y_move);

} else if (move_bottom) {

//底部反弹

int abs = (int)Math.abs(y_move);

// System.out.println("padding_bottom:"+abs);

this.setPadding(0, 0, 0,abs );

MarginLayoutParams layoutParams = (MarginLayoutParams) listView

.getLayoutParams();

layoutParams.topMargin = (int) y_move;

listView.setLayoutParams(layoutParams);

}

invalidate();

break;

case MotionEvent.ACTION_UP:

//System.out.println("up/////////");

if (move_top) {

TranslateAnimation translateAnimation = new  TranslateAnimation( 0, 0,y_move, 0);

translateAnimation.setDuration(200);

translateAnimation.setFillAfter(true);

translateAnimation.setInterpolator(new  LinearInterpolator());

//translateAnimation.start();

translateAnimation.setAnimationListener(new AnimationListener() {

@Override

public void onAnimationStart(Animation animation) {

}

@Override

public void onAnimationRepeat(Animation animation) {

}

@Override

public void onAnimationEnd(Animation animation) {

ListViewFantan.this.setPadding(0, 0, 0, 0);

}

});

listView.startAnimation(translateAnimation);

} else if (move_bottom) {

TranslateAnimation translateAnimation = new  TranslateAnimation( 0, 0,y_move, 0);

translateAnimation.setDuration(200);

translateAnimation.setFillAfter(true);

translateAnimation.setInterpolator(new  LinearInterpolator());

//translateAnimation.start();

translateAnimation.setAnimationListener(new AnimationListener() {

@Override

public void onAnimationStart(Animation animation) {

}

@Override

public void onAnimationRepeat(Animation animation) {

}

@Override

public void onAnimationEnd(Animation animation) {

ListViewFantan.this.setPadding(0, 0, 0, 0);

MarginLayoutParams layoutParams = (MarginLayoutParams) listView

.getLayoutParams();

layoutParams.topMargin = 0;

listView.setLayoutParams(layoutParams);

}

});

listView.startAnimation(translateAnimation);

}

invalidate();

move_top = false;

move_bottom = false;

break;

default:

break;

}

return super.onTouchEvent(ev);

}

private ListView listView;

@Override

protected void onFinishInflate() {

super.onFinishInflate();

View childAt = getChildAt(0);

if (childAt instanceof ListView) {

listView = (ListView) childAt;

}

}

}

时间: 2024-12-15 13:52:13

ListView反弹的相关文章

2014年880个合集Android-实例子源代码文件下载地址合集

***************************************************************************************************优质Android 源码现有各类源码接近6000套,视频教程100套,主要涉及.net网站.软件与安卓系列源码,每套源码都已经经过测试,必须附加使用说明或帮助文档.靠谱不坑爹! 需要打包下载合集地址请的朋友 ,欢迎您与我交流 QQ群: 258450620 或QQ:50841662Android 源代码

Android 实例子源代码文件下载地址380个合集

android 城市列表特效 - 触摸查找源码 .rar: http://www.t00y.com/file/64337887 android 日记系统源码(数据库的基本操作) .rar: http://www.t00y.com/file/64337898 android 查询软件源代码(身份证号,号码归属等) .rar: http://www.t00y.com/file/64337885 ndroid 查询工具源代码 .rar: http://www.t00y.com/file/6433790

[android]完美的解决方案ListView加载网络图片反弹问题

为什么 先说为什么有照片反弹. 使用convertView对ListView的每一个item优化,item的复用能够有效减少内存的占用.使ListView滑动更为流畅. 但会带来一个问题,当最顶部的item滑出屏幕时.会变成下一个从底部将要滑进来的item.每次滑进来的item都要去请求网络获得图片. 第一个item滑出去时,是带着图片的. 其ImageView指向了一块内存.当其慢慢滑出,从底部慢慢滑进时,底部的item与顶部(仅仅有一半在屏幕里能看到了)的还是指向 同一块内存.载入的了同一张

一句话让你的ScrollView、ListView弹力十足

android默认的ScrollView.ListView在最顶端下拉或者最底端上拉的时候,都不会带有反弹效果,很生硬的让你不能继续拖动,不像iOS那样可以回弹,个人认为,iOS的交互还是略好一点,那么我们也来在Android下实现下这个功能,先看下效果图: 那么我们今天的目标是一句话实现,如何去做呢 我们还是先看下代码: package com.xys.flexible; import android.content.Context; import android.util.Attribute

android 滚动栏下拉反弹的效果(相似微信朋友圈)

微信朋友圈上面的图片封面,QQ空间说说上面的图片封面都有下拉反弹的效果,这些都是使用滚动栏实现的.下拉,当松开时候.反弹至原来的位置.下拉时候能看到背景图片.那么这里简介一下这样的效果的实现. 本文源代码下载:点击 1.效果图 这部手机显示的分辨率有限,非常老的手机调试. 2.具有反弹效果BounceScrollView package com.org.scroll; import android.content.Context; import android.graphics.Rect; im

android ListView的上部下拉刷新下部点击加载更多具体实现及拓展

转自:http://blog.csdn.net/jj120522/article/details/8229423 这次就不上图了,例子太多太多了,想必大家都见过.这个功能的实现,简直是开发者必备的. 我也不过多介绍了,网上详细介绍的博客太多太多了,若想深入了解,请参考网上其他博文. 在这里,我只是按照自己的理解,模拟实现了一个,顺便代码贡献出来. 我对之详细标明的注释,想必如果不懂的同学们,看注释也应该明白,前提是,你要耐心看,因为代码有点多,但是我整理过了,还算清晰. 详细代码: [java]

android 滚动条下拉反弹的效果(类似微信朋友圈)

微信朋友圈上面的图片封面,QQ空间说说上面的图片封面都有下拉反弹的效果,这些都是使用滚动条实现的.下拉,当松开时候,反弹至原来的位置.下拉时候能看到背景图片.那么这里简单介绍一下这种效果的实现. 本文源码下载:点击 1.效果图 这部手机显示的分辨率有限,很老的手机调试. 2.具有反弹效果BounceScrollView package com.org.scroll; import android.content.Context; import android.graphics.Rect; imp

ScrollView反弹效果

1 public class BounceScrollView extends ScrollView { 2 private View inner;// 孩子View 3 4 private float y;// 点击时y坐标 5 6 private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.) 7 8 private boolean isCount = false;// 是否开始计算 9 10 public BounceScroll

ScrollView反弹效果 仿小米私密短信效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/28441197 现在很多APP都给ScrollView添加了反弹效果,QQ.小米私密短信等.恰好在网上看到一个类:BounceScrollView , 原创地址是:http://blog.csdn.net/h7870181/article/details/8960430 , 可惜作者没有提供一个效果图,于是我发现小米短信列表页往下拉,有反弹效果,且拉到1/3以上时,会打开私密短信