android listview仿iphone特效 彈性listview

ios常見視圖在頂部往下拉(下衝)或底部往上拉(上衝)有一個彈性回退的動畫效果。著名的CM ROM和一些手機廠商也爭相集成這種效果。android 從2.3開始實現了下衝到底部和上衝到頂部時顏色漸變更畫效果。這種在iphone中經典的特效在必定程度上知足了android迷們追逐體驗的需求。下面咱們來探討實現這種效果的思路和實現錐形。java

  view類有兩個很重要的方法scrollTo和scrollBy,容許移動視圖的可見區域。這就是咱們今天實現動畫效果的理論基礎,咱們能夠在android數據列表頂部往下拖動列表或底部往上拖動列表時相應的移動數據列表,當中止拖動時再讓它彈回去。那麼怎麼才能知道在頂端和底部呢?請查閱ListView的相關資料。具體的原理講完了上代碼。android

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

相關文章
相關標籤/搜索