Android动画机制与使用技巧(三)Android动画特效

来源:互联网 发布:python开发网站 编辑:程序博客网 时间:2024/06/05 09:21

下面来例举一些动画效果实例,让大家熟悉如何通过Android的动画框架来创建赏心悦目的动画

灵动菜单

下图中展示的是灵动菜单的效果图。当用户点击小红点后,弹出菜单,并带有一个缓冲的过渡动画,这也是Google在Material Design中所强调的动画过渡效果

这里写图片描述
这里写图片描述

要实现这样一个动画效果,因为它具有交互性,所以肯定不能使用视图动画而必须使用属性动画。其次,只需要针对每个不同的按钮设置不同的动画,并设置相应的插值器就可以实现展开、合拢效果了。代码如下所示:

public class PropertyTest extends Activity implements View.OnClickListener {    private int[] mRes = {R.id.imageView_a, R.id.imageView_b, R.id.imageView_c,            R.id.imageView_d, R.id.imageView_e};    private List<ImageView> mImageViews = new ArrayList<ImageView>();    private boolean mFlag = true;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_custom_anim_instance_property);        for (int i = 0; i < mRes.length; i++) {            ImageView imageView = (ImageView) findViewById(mRes[i]);            imageView.setOnClickListener(this);            mImageViews.add(imageView);        }    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.imageView_a:                if (mFlag) {                    startAnim();                } else {                    closeAnim();                }                break;            default:                Toast.makeText(PropertyTest.this, "" + v.getId(),                        Toast.LENGTH_SHORT).show();                break;        }    }    private void closeAnim() {        ObjectAnimator animator0 = ObjectAnimator.ofFloat(mImageViews.get(0),                "alpha", 0.5F, 1F);        ObjectAnimator animator1 = ObjectAnimator.ofFloat(mImageViews.get(1),                "translationY", 200F, 0);        ObjectAnimator animator2 = ObjectAnimator.ofFloat(mImageViews.get(2),                "translationX", 200F, 0);        ObjectAnimator animator3 = ObjectAnimator.ofFloat(mImageViews.get(3),                "translationY", -200F, 0);        ObjectAnimator animator4 = ObjectAnimator.ofFloat(mImageViews.get(4),                "translationX", -200F, 0);        AnimatorSet set = new AnimatorSet();        set.setDuration(500);        set.setInterpolator(new BounceInterpolator());        set.playTogether(animator0, animator1, animator2, animator3, animator4);        set.start();        mFlag = true;    }    private void startAnim() {        ObjectAnimator animator0 = ObjectAnimator.ofFloat(                mImageViews.get(0),                "alpha",                1F,                0.5F);        ObjectAnimator animator1 = ObjectAnimator.ofFloat(                mImageViews.get(1),                "translationY",                200F);        ObjectAnimator animator2 = ObjectAnimator.ofFloat(                mImageViews.get(2),                "translationX",                200F);        ObjectAnimator animator3 = ObjectAnimator.ofFloat(                mImageViews.get(3),                "translationY",                -200F);        ObjectAnimator animator4 = ObjectAnimator.ofFloat(                mImageViews.get(4),                "translationX",                -200F);        AnimatorSet set = new AnimatorSet();        set.setDuration(500);        set.setInterpolator(new BounceInterpolator());        set.playTogether(                animator0,                animator1,                animator2,                animator3,                animator4);        set.start();        mFlag = false;    }}

计时器动画

下面通过ValueAnimator来实现计时器的动画效果,当用户点击后数字会不断增加,效果如下所示:

这里写图片描述
这里写图片描述

实现原理就是借助ValueAnimator来实现数字的不断增加,并将值设置给TextView,代码如下所示:

public void tvTimer(final View view) {    ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 100);    valueAnimator.addUpdateListener(            new ValueAnimator.AnimatorUpdateListener() {        @Override        public void onAnimationUpdate(ValueAnimator animation) {            ((TextView) view).setText("$ " +                    (Integer) animation.getAnimatedValue());        }    });    valueAnimator.setDuration(3000);    valueAnimator.start();}

下拉展开动画

下面再通过ValueAnimator来实现一个下拉展开动画的效果,当点击一个View时的时候,显示下面隐藏的一个View,并且让View在显示时增加一个动画效果,因此需要让隐藏的View的高度不断变化,但不是迅速增加到目标值。所以使用ValueAnimator来模拟这个过程。代码如下:

public class DropTest extends Activity {    private LinearLayout mHiddenView;    private float mDensity;    private int mHiddenViewMeasuredHeight;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_custom_anim_instance_drop);        mHiddenView = (LinearLayout) findViewById(R.id.hidden_view);        // 获取像素密度        mDensity = getResources().getDisplayMetrics().density;        // 获取布局的高度        mHiddenViewMeasuredHeight = (int) (mDensity * 40 + 0.5);    }    public void llClick(View view) {        if (mHiddenView.getVisibility() == View.GONE) {            // 打开动画            animateOpen(mHiddenView);        } else {            // 关闭动画            animateClose(mHiddenView);        }    }    private void animateOpen(final View view) {        view.setVisibility(View.VISIBLE);        ValueAnimator animator = createDropAnimator(                view,                0,                mHiddenViewMeasuredHeight);        animator.start();    }    private void animateClose(final View view) {        int origHeight = view.getHeight();        ValueAnimator animator = createDropAnimator(view, origHeight, 0);        animator.addListener(new AnimatorListenerAdapter() {            public void onAnimationEnd(Animator animation) {                view.setVisibility(View.GONE);            }        });        animator.start();    }    //通过ValueAnimator来创建一个从0到目标值的数值发生器,并由此来改变View的布局属性    private ValueAnimator createDropAnimator(            final View view, int start, int end) {        ValueAnimator animator = ValueAnimator.ofInt(start, end);        animator.addUpdateListener(                new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator valueAnimator) {                int value = (Integer) valueAnimator.getAnimatedValue();                ViewGroup.LayoutParams layoutParams =                        view.getLayoutParams();                layoutParams.height = value;                view.setLayoutParams(layoutParams);            }        });        return animator;    }}

这里写图片描述
这里写图片描述

代码下载

阅读全文
0 0
原创粉丝点击