551
技術社區[雲棲]
android listview仿iphone彈簧特效
IOS常見視圖有一個彈性回退的動畫效果,Android 從2.3開始實現了下衝到底部和上衝到底部時顏色漸變動畫效果。View類有兩個很重要的方法scrollTo和scrollBy,允許移動視圖的可見區域。這就是我們今天實現動畫效果的理論基礎,我們可以在android數據列表頂部往下拖動列表或底部拖動相應的移動數據列表,當停止拖動時再讓它彈回去。下麵是代碼部分:
package com.linghu; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ListView; public class Pull_ListView extends ListView implements Runnable { private float mLastDownY = 0f; private int mDistance = 0; private int mStep = 10; private boolean mPositive = false; public Pull_ListView (Context context, AttributeSet attrs) { super(context, attrs); } public Pull_ListView (Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public Pull_ListView (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: break; 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
最後更新:2017-04-02 00:06:52