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

Android特效开发(可伸缩View带互相挤压效果)进阶篇

在上一篇文章末尾我提出了三点不足 ,遂本篇主要是为了解决上篇的不足之处。
对于上一篇的不足之处 有三点 :
     1. 特效动画死板,变化速度死板;
     2. 特效动画不能设置动画时间,如遇到高分辨率的机型,动画时间会变长。
     3. view只能水平伸缩,不能竖直伸缩。
 
对于第一点不足之处变化速度死板,我立马想到了Android中Interpolator类,对于做过Android中动画的同学
来说,这个类应该并不陌生,该类可以改变动画的变化速率,它的直接子类中有
      BounceInterpolator  弹球效果 
      AccelerateInterpolator 加速
     LinearInterpolator 匀速
更多子类可请查阅Android开发文档
它有个getInterpolation (float input) 方法,你可以传入动画消逝时间值(input范围 [0,1] ),0代表开始,1代表
结束,获取变化速率。等会儿代码中有用到这个类。
有关插值器可参考: android动画(一)Interpolator
对于第一二三点不足,我写了辅助类StretchAnimation可以解决。欢迎批评指正。
StretchAnimation只负责view水平拉伸或者垂直拉伸。你可以设置动画的时间,你可以设置它的插值器,改变动
画的效果。下面该类的实现过程。
[java]  
public class StretchAnimation {  
  
    private final static String TAG = "SizeChange";  
    private Interpolator mInterpolator; // 好多书上翻译为插值器  
    private View mView;    // 你要伸缩的view  
    private int mCurrSize; //当前大小  
    private int mRawSize;  
    private int mMinSize; // 最小大小 固定值  
    private int mMaxSize; // 最大大小 固定值  
    private boolean isFinished = true;// 动画结束标识  
    private TYPE mType = TYPE.vertical;  
    private final static int FRAMTIME = 20;// 一帧的时间 毫秒  
    public static enum TYPE {  
        horizontal, // 改变view水平方向的大小  
        vertical    // 改变view竖直方向的大小  
    }  
  
    private int mDuration;  // 动画运行的时间  
    private long mStartTime;// 动画开始时间  
    private float mDurationReciprocal;   
    private int mDSize; // 需要改变view大小的增量  
  
    public StretchAnimation(int maxSize, int minSize, TYPE type, int duration) {  
        if (minSize >= maxSize) {  
            throw new RuntimeException("View的最大改变值不能小于最小改变值");  
        }  
        mMinSize = minSize;  
        mMaxSize = maxSize;  
        mType = type;  
        mDuration = duration;  
    }  
  
    public void setInterpolator(Interpolator interpolator) {  
        mInterpolator = interpolator;  
    }  
  
    public TYPE getmType() {  
        return mType;  
    }  
  
    public boolean isFinished() {  
        return isFinished;  
    }  
  
    public void setDuration(int duration) {  
        mDuration = duration;  
    }  
  
    private void changeViewSize() {  
  
        if (mView != null && mView.getVisibility() != View.GONE) {  
            LayoutParams params = mView.getLayoutParams();  
            if (mType == TYPE.vertical) {  
                params.height = mCurrSize;  
            } else if (mType == TYPE.horizontal) {  
                params.width = mCurrSize;  
            }  
            Log.i(TAG, "CurrSize = " + mCurrSize + " Max=" + mMaxSize + " min="  
                    + mMinSize);  
            mView.setLayoutParams(params);  
        }  
    }  
  
    private Handler mHandler = new Handler() {  
  
        @Override  
        public void handleMessage(Message msg) {  
  
            if (msg.what == 1) {  
                if (!computeViewSize()) {  
  
                    mHandler.sendEmptyMessageDelayed(1, FRAMTIME);  
                } else {  
                    if (animationlistener != null) {  
                        animationlistener.animationEnd(mView);  
                    }  
                }  
            }  
            super.handleMessage(msg);  
        }  
  
    };  
  
    /** 
     * @return 返回true 表示动画完成 
     */  
    private boolean computeViewSize() {  
  
        if (isFinished) {  
            return isFinished;  
        }  
        int timePassed = (int) (AnimationUtils.currentAnimationTimeMillis() - mStartTime);  
  
        if (timePassed <= mDuration) {  
            float x = timePassed * mDurationReciprocal;  
            if (mInterpolator != null) {  
                x = mInterpolator.getInterpolation(x);  
            }  
            mCurrSize = mRawSize + Math.round(x * mDSize);  
        } else {
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,