ios常見視圖在頂部往下拉(下沖)或底部往上拉(上沖)有一個彈性回退的動畫效果。著名的CM room和一些手機廠商也爭相集成這種效果。android 從2.3開始實現瞭下沖到底部和上沖到底部時顏色漸變動畫效果。這種在iphone中經典的特效在一定程度上滿足瞭android迷們追逐體驗的需求。下面我們來探討實現這種效果的思路和實現錐形。
view類有兩個很重要的方法scrollTo和scrollBy,允許移動視圖的可見區域。這就是我們今天實現動畫效果的理論基礎,我們可以在android數據列表頂部往下拖動列表或底部拖動相應的移動數據列表,當停止拖動時再讓它彈回去。那麼怎麼才能知道在頂端和底部呢?請查閱ListView的相關資料。具體的原理講完瞭上代碼。
Java代碼
package com.droidwolf;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView;
//by droidwolf 轉載請註明
public class IpListView extends ListView implements Runnable {
private float mLastDownY = 0f;
private int mDistance = 0;
private int mStep = 10;
private boolean mPositive = false;
public IpListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public IpListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public IpListView(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (mLastDownY == 0f && mDistance == 0) {
mLastDownY = event.getY();
return true;
}
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (mDistance != 0) {
mStep = 1;
mPositive = mDistance >= 0;
this.post(this);
return true;
}
mLastDownY = 0f;
mDistance = 0;
break;
case MotionEvent.ACTION_MOVE:
if (mLastDownY != 0f) {
mDistance = (int) (mLastDownY – event.getY());
if ((mDistance < 0 && getFirstVisiblePosition() == 0 && getChildAt(0).getTop() == 0)
|| (mDistance > 0 && getLastVisiblePosition() == getCount() – 1)) {
mDistance /= 2;
scrollTo(0, mDistance);
return true;
}
}
mDistance = 0;
break;
}
return super.onTouchEvent(event);
}
@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 += 1;
this.postDelayed(this, 10);
}
}// end class
IpListView實現的動畫隻是簡單的回退效果,也沒有實現上沖和下沖特效,具體實現留給您去完善吧~~
作者“hemowolf”