当前位置:操作系统 > 安卓/Android >>

android listview仿iphone特效

  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”
 

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,