android listview仿iphone特效

来源:互联网 发布:开淘宝网店不交保证金 编辑:程序博客网 时间:2024/05/22 07:49
ios常见视图在顶部往下拉(下冲)或底部往上拉(上冲)有一个弹性回退的动画效果。著名的CM ROM和一些手机厂商也争相集成这种效果。android 从2.3开始实现了下冲到底部和上冲到顶部时颜色渐变动画效果。这种在iphone中经典的特效在一定程度上满足了android迷们追逐体验的需求。下面我们来探讨实现这种效果的思路和实现锥形。

  view类有两个很重要的方法scrollTo和scrollBy,允许移动视图的可见区域。这就是我们今天实现动画效果的理论基础,我们可以在android数据列表顶部往下拖动列表或底部往上拖动列表时相应的移动数据列表,当停止拖动时再让它弹回去。那么怎么才能知道在顶端和底部呢?请查阅ListView的相关资料。具体的原理讲完了上代码。

 

Java代码 复制代码 收藏代码
  1. package com.droidwolf;   
  2.   
  3. import android.content.Context;   
  4. import android.util.AttributeSet;   
  5. import android.view.MotionEvent;   
  6. import android.widget.ListView;   
  7. //by droidwolf 转载请注明   
  8. public class IpListView extends ListView implements Runnable {   
  9.     private float mLastDownY = 0f;   
  10.     private int mDistance = 0;   
  11.     private int mStep = 10;   
  12.     private boolean mPositive = false;   
  13.   
  14.     public IpListView(Context context, AttributeSet attrs) {   
  15.     super(context, attrs);   
  16.     }   
  17.   
  18.     public IpListView(Context context, AttributeSet attrs, int defStyle) {   
  19.     super(context, attrs, defStyle);   
  20.     }   
  21.   
  22.     public IpListView(Context context) {   
  23.     super(context);   
  24.     }   
  25.   
  26.     @Override  
  27.     public boolean onTouchEvent(MotionEvent event) {   
  28.     switch (event.getAction()) {   
  29.     case MotionEvent.ACTION_DOWN:   
  30.         if (mLastDownY == 0f && mDistance == 0) {   
  31.         mLastDownY = event.getY();   
  32.         return true;   
  33.         }   
  34.         break;   
  35.   
  36.     case MotionEvent.ACTION_CANCEL:   
  37.     case MotionEvent.ACTION_UP:   
  38.         if (mDistance != 0) {   
  39.         mStep = 1;   
  40.         mPositive = mDistance >= 0;   
  41.         this.post(this);   
  42.         return true;   
  43.         }   
  44.   
  45.         mLastDownY = 0f;   
  46.         mDistance = 0;   
  47.         break;   
  48.   
  49.     case MotionEvent.ACTION_MOVE:   
  50.         if (mLastDownY != 0f) {   
  51.         mDistance = (int) (mLastDownY - event.getY());   
  52.         if ((mDistance < 0 && getFirstVisiblePosition() == 0 && getChildAt(0).getTop() == 0)   
  53.             || (mDistance > 0 && getLastVisiblePosition() == getCount() - 1)) {   
  54.             mDistance /= 2;   
  55.             scrollTo(0, mDistance);   
  56.             return true;   
  57.         }   
  58.         }   
  59.         mDistance = 0;   
  60.         break;   
  61.     }   
  62.     return super.onTouchEvent(event);   
  63.     }   
  64.   
  65.     @Override  
  66.     public void run() {   
  67.     mDistance += mDistance > 0 ? -mStep : mStep;   
  68.     scrollTo(0, mDistance);   
  69.     if ((mPositive && mDistance <= 0) || (!mPositive && mDistance >= 0)) {   
  70.         scrollTo(00);   
  71.         mDistance = 0;   
  72.         mLastDownY = 0f;   
  73.         return;   
  74.     }   
  75.     mStep += 1;   
  76.     this.postDelayed(this10);   
  77.     }   
  78. }// end class  

 

IpListView实现的动画只是简单的回退效果,也没有实现上冲和下冲特效,具体实现留给您去完善吧~~

原创粉丝点击