閱讀874 返回首頁    go 阿裏雲 go 技術社區[雲棲]


android listview仿iphone特效(下拉(下衝)或底部往上拉(上衝)有一個彈性回退)

https://hemowolf.iteye.com/blog/1181065

 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實現的動畫隻是簡單的回退效果,也沒有實現上衝和下衝特效,具體實現留給您去完善吧~~

 


最後更新:2017-04-02 22:16:08

  上一篇:go 利用Page事件進行統一身份驗證
  下一篇:go Response.write後馬上運行Response.redirect,Response.write沒反應