欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 控件位移动画

程序员文章站 2022-07-14 17:42:09
...

      前面分享了一些开源动画,又是引用库,又是设置一些东西,但是在实际项目运用中多多少少还是有些出入的。不过没关系,人家大神的创作的思想是没毛病的,咱可以看看效果然后自己去写一个。可能我个人比较懒,就喜欢工具类,点一个方法就搞定。

老规矩,做记录,闲话不多说!先来看看效果

Android 控件位移动画  Android 控件位移动画

 

这是一个位移动画,到项目中还是实用的,可以自行UI修改处理。

上代码

一、弹出动画(不管它从哪里弹出,反正就是可以上下左右弹出)

private void showAnimation() {
        //获取View初始化后的高度
        height = dp2px(view.getHeight());
        //前2个参数是X轴(就是横向位移)
        //第一个参数是进入(弹出)第二个参数是退出
        //后2个参数Y轴(就是纵向位移)参数同上
        Animation animation = new TranslateAnimation(-height, 0, 0, 0);
        animation.setDuration(1000);//动画从开始到结束执行的时间
        animation.setFillAfter(true);//设置为true,动画转化结束后被应用
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                Log.i("动画1","Start");
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                animation.cancel();
                isShowAnimation = true;
                Log.i("动画1","End");
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });
        view.startAnimation(animation);//开始动画
    }

二、退出动画(从哪里来,回那里去)

private void hideAnimation(){
        height = dp2px(recyclerView.getHeight());
        //同样的代码唯一的改动在参数这里
        Animation animation = new TranslateAnimation(0, -height, 0, 0);
        animation.setDuration(1000);
        animation.setFillAfter(true);//设置为true,动画转化结束后被应用
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                Log.i("动画2","Start2");
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                Log.i("动画2","End2");
                isShowAnimation = false;
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });
        view.startAnimation(animation);//开始动画
    }

其实上面的2个方法是可以优化的,只用一个方法就可以了,


//在这里可以加一个Boolean判断,然后改变一下这个参数即可,记得把对象要提出来作为全局对象
Animation animation = new TranslateAnimation(0, -height, 0, 0);

以下是简洁化后的完整Util代码

public class AnimationViewUtils {
    private Context mContext;
    private View mView;
    private OnAnimationClickListener animationClickListener;
    private boolean isShowAnimation;
    private int height;
    private Animation animation;

    public AnimationViewUtils(Context context, View view) {
        this.mContext = context;
        this.mView = view;

    }

    public void executeAnimation() {
        mView.setVisibility(View.VISIBLE);
        height = dp2px(mView.getHeight());//获取初始化后的控件高度
        if (!isShowAnimation) {
            animation = new TranslateAnimation(-height, 0, 0, 0);
        } else {
            animation = new TranslateAnimation(0, -height, 0, 0);
        }
        animation.setDuration(1000);
        animation.setFillAfter(true);//设置为true,动画转化结束后被应用
        //动画监听
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                if (!isShowAnimation) {
                    isShowAnimation = true;
                } else {
                    isShowAnimation = false;
                    mView.setVisibility(View.GONE);
                }
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
        mView.startAnimation(animation);//开始动画

    }

    //如果有需要自行回调
    public interface OnAnimationClickListener {
        //参数(父组件,当前单击的View,单击的View的位置,数据)
        void onShowAnimationEnd();

        void onHideAnimationEnd();
    }

    public void setOnAnimationClickListener(OnAnimationClickListener clickListener) {
        this.animationClickListener = clickListener;
    }

    //dp转像素
    private int dp2px(int value) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, mContext.getResources().getDisplayMetrics());
    }
}

当然,上面的的实例是一个左边弹出动画,到这里就结束了,如果想要顶部或者底部,修改

animation = new TranslateAnimation(-height, 0, 0, 0);这里面的参数即可

示例Demo

END