关于listview弹簧效果
来源:互联网 发布:云计算的应用实例 编辑:程序博客网 时间:2024/04/27 16:29
公司让我把源码settings中的listview具有弹簧效果,类似魅族的那种,可以上下滑动。查了资料,发现:
1.可以在listview的父类abslistview中重写一个回调方法
OverScrollBy(),但是效果是只有listview超过屏幕时才会有弹簧效果,如果listview只有3,4个item是没有效果的。
2.在listviewh中重写OntouchEvent(),在这个方法中通过计算和scrollTo()来达到弹簧效果。但是这种方法会与点击事件冲突。
3.在abslistview中重写OntouchEvent(),也是会有冲突
4.自定义一个listview,重写ontouchEvent(),可以实现。将framworks中的perence里的一些相关布局中的listview改成自定义的,那里用到就在那里改。这也算是这种方法的缺点。如果要让整个系统中的listview都实现弹簧效果,这种方法是不可取的。只能分析源码,解决冲突了。可能是我天生愚钝或者水平不高,看源码对我来说有点困难。这是我接下来要克服和适应的地方。
代码:
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView;
public class MyListView extends ListView implements Runnable{
private float mLastDownY = 0f;
private int mDistance = 0; // 手指/弹簧拉去移动的距离
private int mStep = 10;
private boolean mPositive = false; // 滚动方向
public MyListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch(ev.getAction()){
case MotionEvent.ACTION_DOWN:
if(getFirstVisiblePosition()==0||getLastVisiblePosition()==getCount()-1){
mLastDownY = ev.getY();
return true;
}
mDistance =0;
break;
case MotionEvent.ACTION_MOVE:
mDistance=(int)(mLastDownY-ev.getY());
if((mDistance<0&&(getFirstVisiblePosition()==0))||(mDistance>0&&(getLastVisiblePosition()==getCount()-1))){
mDistance/=2;
scrollTo(0, mDistance);
return true;
}
mDistance = 0;
break;
case MotionEvent.ACTION_UP:
if ((mDistance < 0 && getFirstVisiblePosition() == 0)
|| (mDistance > 0 && getLastVisiblePosition() == getCount() - 1)) {
mStep = 1;
mPositive = (mDistance >= 0);
this.post(this); // 启动子线程,用于 "弹回" 效果
return true;
}
mDistance = 0;
break;
}
return super.onTouchEvent(ev);
}
@Override
public void run() {
mDistance += mDistance > 0 ? -mStep : mStep;
scrollTo(0, mDistance);
if ((mPositive && mDistance <= 0) || (!mPositive && mDistance >= 0)) {
scrollTo(0, 0);
mDistance = 0;
mLastDownY = 0f;
return;
}
mStep += 5;
this.postDelayed(this, 10);
}
}
0 0
- 关于listview弹簧效果
- ListView的上拉和下拉弹簧效果
- 仿IOS效果-带弹簧动画的ListView
- JavaScript 弹簧效果
- JavaScript 弹簧效果
- Android 弹簧动画效果
- UITextView弹簧效果属性
- 弹簧动画效果
- Android 弹簧动画效果
- 果冻弹簧效果动画
- 弹簧动画效果
- 弹簧效果切换按钮
- iOS动画实现:弹簧效果
- iOS动画实现:弹簧效果
- iOS动画之弹簧效果
- iOS UIScrollview 取消弹簧效果
- android listview仿iphone弹簧特效
- android listview仿iphone弹簧特效
- 日经春秋 20150109
- Android常见错误处理(二)
- j2ee中文编码问题的解决方法(ISO8859_1、GBK、UTF-8)
- oracle中的%type,%rowtype
- 浅谈oracle复合数据类型
- 关于listview弹簧效果
- oracle中bulk collect用法
- oracle数组使用实例
- JBOSS启动(前台/后台)
- jQuery实现等比例缩放大图片
- Java 接口与类
- Visual C++剪贴板操作不完全攻略
- oracle随机数(dbms_random包)
- Lex与Yacc学习(一)之环境配置篇