天天看點

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

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

 ios常見視圖在頂部往下拉(下沖)或底部往上拉(上沖)有一個彈性回退的動畫效果。著名的cm rom和一些手機廠商也争相內建這種效果。android 從2.3開始實作了下沖到底部和上沖到頂部時顔色漸變動畫效果。這種在iphone中經典的特效在一定程度上滿足了android迷們追逐體驗的需求。下面我們來探讨實作這種效果的思路和實作錐形。

  view類有兩個很重要的方法scrollto和scrollby,允許移動視圖的可見區域。這就是我們今天實作動畫效果的理論基礎,我們可以在android資料清單頂部往下拖動清單或底部往上拖動清單時相應的移動資料清單,當停止拖動時再讓它彈回去。那麼怎麼才能知道在頂端和底部呢?請查閱listview的相關資料。具體的原理講完了上代碼。

java代碼  

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

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);  

        mlastdowny = 0f;  

        mdistance = 0;  

    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;  

    return super.ontouchevent(event);  

    public void run() {  

    mdistance += mdistance > 0 ? -mstep : mstep;  

    scrollto(0, mdistance);  

    if ((mpositive && mdistance <= 0) || (!mpositive && mdistance >= 0)) {  

        scrollto(0, 0);  

        return;  

    mstep += 1;  

    this.postdelayed(this, 10);  

}// end class  

iplistview實作的動畫隻是簡單的回退效果,也沒有實作上沖和下沖特效,具體實作留給您去完善吧~~

iplistview.rar (39.7 kb)

下載下傳次數: 216

繼續閱讀