CircularReveal

来源:互联网 发布:单片机一键信号发射 编辑:程序博客网 时间:2024/06/05 09:03

        final FrameLayout fl_frame = findViewById(R.id.fl_frame);        final Button btn_button = findViewById(R.id.btn_button);        final DisplayMetrics dm = getResources().getDisplayMetrics();        int w_screen = dm.widthPixels;//屏幕宽度        int h_screen = dm.heightPixels;//屏幕高度        final int x = (int) (dm.widthPixels / dm.density) / 2;//屏幕中心点x        final int y = (int) (dm.heightPixels / dm.density) / 2;//屏幕中心点y        Log.i(TAG, "屏幕尺寸2:宽度 = " + w_screen + "高度 = " + h_screen + "密度 = " + dm.density);        btn_button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                CircularReveal.startAnimation(MyApplication.getContext(), fl_frame, x, y, btn_button);            }        });



import android.animation.Animator;import android.content.Context;import android.os.Build;import android.util.Log;import android.view.View;import android.view.ViewAnimationUtils;import android.widget.Button;import android.widget.FrameLayout;import static android.content.ContentValues.TAG;public class CircularReveal {    /**     * @param context context     * @param frame   执行动画的布局     * @param x       x点     * @param y       y点     * @param btn     控制动画的按钮     */    public static void startAnimation(final Context context, final FrameLayout frame, int x, int y, final Button btn) {        //隐藏        if (frame.getVisibility() == View.VISIBLE) {            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//>=21 开始动画                final Animator animatorHide = ViewAnimationUtils.createCircularReveal(frame, frame.getWidth() - dip2px(context, x), dip2px(context, y), (float) Math.hypot(frame.getWidth(), frame.getHeight()), 0);                animatorHide.addListener(new Animator.AnimatorListener() {                    @Override                    public void onAnimationStart(Animator animation) {                        btn.setClickable(false);//动画开始之后,将按钮设置不可以点击,防止动画中断                    }                    @Override                    public void onAnimationEnd(Animator animation) {                        frame.setVisibility(View.GONE);//动画结束之后布局隐藏                        btn.setClickable(true);//动画结束之后可以点击                    }                    @Override                    public void onAnimationCancel(Animator animation) {                    }                    @Override                    public void onAnimationRepeat(Animator animation) {                    }                });                animatorHide.setDuration(3000);//动画时间                animatorHide.start();            } else {//否则将布局直接隐藏                frame.setVisibility(View.GONE);            }            frame.setEnabled(false);        }        //显示        else {            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//>=21 开始动画                final Animator animator = ViewAnimationUtils.createCircularReveal(frame, frame.getWidth() - dip2px(context, x), dip2px(context, y), 0, (float) Math.hypot(frame.getWidth(), frame.getHeight()));                frame.setVisibility(View.VISIBLE);                if (frame.getVisibility() == View.VISIBLE) {                    animator.addListener(new Animator.AnimatorListener() {                        @Override                        public void onAnimationStart(Animator animation) {                            btn.setClickable(false);//动画开始之后不可以点击                        }                        @Override                        public void onAnimationEnd(Animator animation) {                            frame.setVisibility(View.VISIBLE);//动画结束之后布局显示                            btn.setClickable(true);//动画结束之后可以点击                        }                        @Override                        public void onAnimationCancel(Animator animation) {                        }                        @Override                        public void onAnimationRepeat(Animator animation) {                        }                    });                    animator.setDuration(3000);//动画时间                    animator.start();                    frame.setEnabled(true);//显示时激活                }            } else {//否则将布局直接显示                frame.setVisibility(View.VISIBLE);            }            frame.setEnabled(true);        }    }    public static int dip2px(Context context, float dp) {        final float scale = context.getResources().getDisplayMetrics().density;        Log.i(TAG, "dip2px: " + (int) (dp * scale + 0.5));        return (int) (dp * scale + 0.5);    }}