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); } }