package com.example.lovedemo.activity;
import androidx.appcompat.app.AppCompatActivity;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.AlertDialog;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.KeyEvent;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.example.lovedemo.R;
import com.example.lovedemo.dialog.CloseAlertDialogUtils;
import com.example.lovedemo.dialog.QuitDialog;
import com.example.lovedemo.dialog.VindicateDialog;
import com.example.lovedemo.tools.Utils;
import com.example.lovedemo.view.StarRainView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
private FrameLayout container;
private StarRainView starRainView;
// 多种星形资源
private int[] starResIds = {
R.drawable.a1, R.drawable.a2, R.drawable.a3,
R.drawable.a4, R.drawable.a5, R.drawable.a6,
R.drawable.a7, R.drawable.a8, R.drawable.a9,
R.drawable.a10, R.drawable.a11, R.drawable.a12,
R.drawable.a13, R.drawable.a14, R.drawable.a15,
R.drawable.a16, R.drawable.a17, R.drawable.a18, R.drawable.a19
};
private Random random = new Random();
private long currentDelay = 0;
private final long delayBetweenStars = 500; // 每颗星星间隔时间
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
container = findViewById(R.id.container);
starRainView = findViewById(R.id.star_rain_view);
// 依次绘制图形
drawLetterI();
drawHeart();
drawLetterU();
}
// 创建带有动画的 ImageView
private ImageView createStar(float x, float y) {
ImageView imageView = new ImageView(this);
imageView.setImageResource(starResIds[random.nextInt(starResIds.length)]);
imageView.setLayoutParams(new FrameLayout.LayoutParams(35, 35));
imageView.setX(x);
imageView.setY(y);
imageView.setAlpha(0f);
imageView.setScaleX(0.5f);
imageView.setScaleY(0.5f);
// 缩放和透明度动画
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(imageView, "alpha", 0f, 1f);
ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(imageView, "scaleX", 0.5f, 1f);
ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(imageView, "scaleY", 0.5f, 1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(alphaAnim, scaleXAnim, scaleYAnim);
animatorSet.setDuration(3500);
// 延迟执行
new Handler(Looper.getMainLooper()).postDelayed(animatorSet::start, currentDelay);
currentDelay += delayBetweenStars;
return imageView;
}
// 绘制字母 I
private void drawLetterI() {
int centerX = 530;
int startY = 200;
// 绘制顶部横杠
for (int i = -2; i < 3; i++) {
ImageView topBarStar = createStar(centerX + i * 40, startY - 40);
container.addView(topBarStar);
}
// 绘制垂直列(中间部分)
for (int i = 0; i < 9; i++) {
float y = startY + i * 40;
ImageView star = createStar(centerX, y);
container.addView(star);
}
// 绘制底部横杠
for (int i = -2; i < 3; i++) {
ImageView bottomBarStar = createStar(centerX + i * 40, startY + 8 * 40);
container.addView(bottomBarStar);
}
}
// 绘制心形图案
private void drawHeart() {
int centerX = 530;
int centerY = 900;
int size = 15;
// 设置图片资源,例如你有一个叫 "heart_image" 的图片资源
for (double t = 0; t < 2 * Math.PI; t += 0.2) {
double xVal = 16 * Math.pow(Math.sin(t), 3);
double yVal = 13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t);
float px = (float) (centerX + xVal * size);
float py = (float) (centerY - yVal * size);
ImageView star = createStar(px, py);
container.addView(star);
}
// 添加心形中央图片并设置缩放动画
new Handler(Looper.getMainLooper()).postDelayed(() -> {
ImageView heartImage = new ImageView(this);
heartImage.setImageResource(R.drawable.h_m_m); // 使用自己的心形图片资源
heartImage.setLayoutParams(new FrameLayout.LayoutParams(260, 260)); // 设置合适的大小
heartImage.setX(centerX - 105); // 设置图片X位置
heartImage.setY(centerY - 65); // 设置图片Y位置
// 设置缩放动画
ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(heartImage, "scaleX", 0f, 1f);
ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(heartImage, "scaleY", 0f, 1f);
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(heartImage, "alpha", 0f, 1f);
AnimatorSet heartAnimatorSet = new AnimatorSet();
heartAnimatorSet.playTogether(scaleXAnim, scaleYAnim, alphaAnim);
heartAnimatorSet.setDuration(3500); // 设置动画时长
container.addView(heartImage);
heartAnimatorSet.start();
}, 20 * 1000); // 设置延迟,在绘制完心形图案后开始执行
}
// 绘制字母 U(底部为圆弧)
private void drawLetterU() {
long totalDuration = 0;
int startX = 410;
int startY = 1300;
// 左侧横线
for (int i = -6; i < 8; i++) {
float x = (float) (startX + i * -5);
ImageView star = createStar(x, startY);
container.addView(star);
}
// 右侧横线
for (int i = -6; i < 8; i++) {
float x = startX + i * -5;
ImageView star = createStar(x + 250, startY);
container.addView(star);
}
// 左侧竖线
for (int i = 0; i < 8; i++) {
float y = startY + i * 40;
ImageView star = createStar(startX, y);
container.addView(star);
}
// 右侧竖线(更宽了)
for (int i = 0; i < 8; i++) {
float y = startY + i * 40;
ImageView star = createStar(startX + 250, y);
container.addView(star);
}
// 底部绘制一个圆弧形(近似)
int centerX = startX + 125; // 新增宽度后的新中点
int centerY = startY + 7 * 40; // Y 不变
int radius = 110; // 增大半径以适应新宽度
int points = 9; // 更多点数,圆弧更平滑
for (int i = 0; i < points; i++) {
double angle = Math.PI * i / (points - 1); // 从 π 到 2π 的角度(下半圆)
float x = (float) (centerX + radius * Math.cos(angle));
float y = (float) (centerY + radius * Math.sin(angle));
ImageView star = createStar(x, y);
container.addView(star);
totalDuration += 5500;
}
new Handler(Looper.getMainLooper()).postDelayed(this::triggerCornerAnimations, totalDuration);
}
private void triggerCornerAnimations() {
// 右上:从左向右移动
showCornerImageWithTranslation(R.drawable.up_right, container.getWidth(), 0, container.getWidth() - 150, -35);
// 中间:从左到中间移动
showCornerImageWithTranslation(R.drawable.upmidd, -150, 100, container.getWidth() / 2 - 130, -35, 250, 150);
// 左上:从左移动到左上
showCornerImageWithTranslation(R.drawable.up_left, -100, 0, 0, -35);
// 左下角动画:保持缩放效果
animateCorner(R.drawable.down_left, -10, container.getHeight() - 150);
//下边距动画:保持缩放效果
Utils.animateCorner(R.drawable.downmidd, container.getWidth() / 2 - 120, container.getHeight() - 125, MainActivity.this, container, 250, 200);
// 右下角动画:保持缩放效果
animateCorner(R.drawable.down_right, container.getWidth() - 140, container.getHeight() - 150);
// 延迟执行,在所有动画完成后添加心形图案下方的图片
new Handler(Looper.getMainLooper()).postDelayed(this::addImagesNearHeart, 6500); // 调整延迟时间确保所有动画完成
}
private void animateCorner(int resId, float startX, float startY) {
ImageView cornerImage = new ImageView(this);
cornerImage.setImageResource(resId);
cornerImage.setLayoutParams(new FrameLayout.LayoutParams(150, 150));
cornerImage.setX(startX);
cornerImage.setY(startY);
cornerImage.setAlpha(0f);
AnimatorSet animatorSet = new AnimatorSet();
// 缩放动画:保持原有逻辑
cornerImage.setScaleX(0.5f);
cornerImage.setScaleY(0.5f);
ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(cornerImage, "scaleX", 0.5f, 1f);
ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(cornerImage, "scaleY", 0.5f, 1f);
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(cornerImage, "alpha", 0f, 1f);
animatorSet.playTogether(scaleXAnim, scaleYAnim, alphaAnim);
animatorSet.setDuration(3500);
container.addView(cornerImage);
animatorSet.start();
}
private void showCornerImageWithTranslation(int resId, float startX, float startY, float endX, float endY) {
ImageView cornerImage = new ImageView(this);
cornerImage.setImageResource(resId);
cornerImage.setLayoutParams(new FrameLayout.LayoutParams(150, 150));
cornerImage.setX(startX);
cornerImage.setY(startY);
cornerImage.setAlpha(0f);
cornerImage.setScaleX(1f);
cornerImage.setScaleY(1f);
container.addView(cornerImage);
// Alpha animation
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(cornerImage, "alpha", 0f, 1f);
// Translation animations
ObjectAnimator translateXAnim = ObjectAnimator.ofFloat(cornerImage, "x", startX, endX);
ObjectAnimator translateYAnim = ObjectAnimator.ofFloat(cornerImage, "y", startY, endY);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(alphaAnim, translateXAnim, translateYAnim);
animatorSet.setDuration(3500);
animatorSet.start();
}
// 创建平移动画的辅助方法
private void showCornerImageWithTranslation(int resId, float startX, float startY, float endX, float endY, int width, int height) {
ImageView cornerImage = new ImageView(this);
cornerImage.setImageResource(resId);
// 设置图片的宽度和高度
cornerImage.setLayoutParams(new FrameLayout.LayoutParams(width, height));
cornerImage.setX(startX);
cornerImage.setY(startY);
cornerImage.setAlpha(0f);
cornerImage.setScaleX(1f);
cornerImage.setScaleY(1f);
container.addView(cornerImage);
// Alpha 动画
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(cornerImage, "alpha", 0f, 1f);
ObjectAnimator translateXAnim = ObjectAnimator.ofFloat(cornerImage, "x", startX, endX);
ObjectAnimator translateYAnim = ObjectAnimator.ofFloat(cornerImage, "y", startY, endY);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(alphaAnim, translateXAnim, translateYAnim);
animatorSet.setDuration(3500);
// 在动画结束后,添加缩放动画的新图片
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
// 在图片的正中心创建新图片
float centerX = (float) (cornerImage.getX() + (cornerImage.getWidth() / 1.6));
float centerY = (float) (cornerImage.getY() + (cornerImage.getHeight() / 1.9));
// 创建新图片
ImageView zoomImage = new ImageView(MainActivity.this);
zoomImage.setImageResource(R.drawable.love_middle_down); // 替换成你的新图片资源
zoomImage.setLayoutParams(new FrameLayout.LayoutParams(50, 50)); // 设置缩放图片的大小
container.addView(zoomImage);
// 设置新图片的初始位置为正中心
zoomImage.setX(centerX - 50); // 100/2 使得图片位于中心
zoomImage.setY(centerY - 50); // 100/2 使得图片位于中心
// 创建缩放动画
ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(zoomImage, "scaleX", 0f, 1f);
ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(zoomImage, "scaleY", 0f, 1f);
AnimatorSet scaleAnimatorSet = new AnimatorSet();
scaleAnimatorSet.playTogether(scaleXAnim, scaleYAnim);
scaleAnimatorSet.setDuration(3500); // 设定缩放动画的时长
scaleAnimatorSet.start();
// 在屏幕的左右两边添加缩放动画的新图片
// 左侧图片
ImageView leftImage = new ImageView(MainActivity.this);
leftImage.setImageResource(R.drawable.midd_midd_left); // 替换成你左侧的图片资源
leftImage.setLayoutParams(new FrameLayout.LayoutParams(150, ViewGroup.LayoutParams.MATCH_PARENT)); // 设置左侧图片的大小
container.addView(leftImage);
// 设置左侧图片的位置
leftImage.setX(0); // 屏幕左边
leftImage.setY(centerY - 50); // 垂直居中
// 创建左侧图片的缩放动画
ObjectAnimator leftScaleXAnim = ObjectAnimator.ofFloat(leftImage, "scaleX", 0f, 1f);
ObjectAnimator leftScaleYAnim = ObjectAnimator.ofFloat(leftImage, "scaleY", 0f, 1f);
AnimatorSet leftScaleAnimatorSet = new AnimatorSet();
leftScaleAnimatorSet.playTogether(leftScaleXAnim, leftScaleYAnim);
leftScaleAnimatorSet.setDuration(3500);
leftScaleAnimatorSet.start();
// 右侧图片
ImageView rightImage = new ImageView(MainActivity.this);
rightImage.setImageResource(R.drawable.midd_midd_right); // 替换成你右侧的图片资源
rightImage.setLayoutParams(new FrameLayout.LayoutParams(150, ViewGroup.LayoutParams.MATCH_PARENT)); // 设置右侧图片的大小
container.addView(rightImage);
// 设置右侧图片的位置
rightImage.setX(getResources().getDisplayMetrics().widthPixels - 150); // 屏幕右边
rightImage.setY(centerY - 50); // 垂直居中
// 创建右侧图片的缩放动画
ObjectAnimator rightScaleXAnim = ObjectAnimator.ofFloat(rightImage, "scaleX", 0f, 1f);
ObjectAnimator rightScaleYAnim = ObjectAnimator.ofFloat(rightImage, "scaleY", 0f, 1f);
AnimatorSet rightScaleAnimatorSet = new AnimatorSet();
rightScaleAnimatorSet.playTogether(rightScaleXAnim, rightScaleYAnim);
rightScaleAnimatorSet.setDuration(3500);
rightScaleAnimatorSet.start();
}
});
animatorSet.start();
}
private void addImagesNearHeart() {
// 获取心形图案的位置
int centerX = 530;
int centerY = 900;
// 左侧图片
ImageView leftImage = new ImageView(this);
leftImage.setImageResource(R.drawable.love_m_left); // 替换成你的左侧图片资源
leftImage.setLayoutParams(new FrameLayout.LayoutParams(150, 150)); // 设置图片大小
leftImage.setX(centerX - 250); // 设置位置,心形图片左侧
leftImage.setY(centerY + 100); // 设置位置,心形图片下方
leftImage.setAlpha(0f); // 初始透明度为0
container.addView(leftImage);
// 右侧图片
ImageView rightImage = new ImageView(this);
rightImage.setImageResource(R.drawable.hudei); // 替换成你的右侧图片资源
rightImage.setLayoutParams(new FrameLayout.LayoutParams(150, 150)); // 设置图片大小
rightImage.setX(centerX + 280); // 设置位置,心形图片右侧
rightImage.setY(centerY + 50); // 设置位置,心形图片下方
rightImage.setAlpha(0f); // 初始透明度为0
container.addView(rightImage);
// 缩放动画
ObjectAnimator scaleXLeft = ObjectAnimator.ofFloat(leftImage, "scaleX", 0f, 1f);
ObjectAnimator scaleYLeft = ObjectAnimator.ofFloat(leftImage, "scaleY", 0f, 1f);
ObjectAnimator alphaLeft = ObjectAnimator.ofFloat(leftImage, "alpha", 0f, 1f);
ObjectAnimator scaleXRight = ObjectAnimator.ofFloat(rightImage, "scaleX", 0f, 1f);
ObjectAnimator scaleYRight = ObjectAnimator.ofFloat(rightImage, "scaleY", 0f, 1f);
ObjectAnimator alphaRight = ObjectAnimator.ofFloat(rightImage, "alpha", 0f, 1f);
// 创建 AnimatorSet
AnimatorSet animatorSetLeft = new AnimatorSet();
animatorSetLeft.playTogether(scaleXLeft, scaleYLeft, alphaLeft);
animatorSetLeft.setDuration(3500); // 设置动画时长
AnimatorSet animatorSetRight = new AnimatorSet();
animatorSetRight.playTogether(scaleXRight, scaleYRight, alphaRight);
animatorSetRight.setDuration(3500); // 设置动画时长
// animatorSetRight.addListener(new AnimatorListenerAdapter() {
// @Override
// public void onAnimationEnd(Animator animation) {
// new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
// @Override
// public void run() {
// int type = 2;
// VindicateDialog dialog = VindicateDialog.getInstance();
// VindicateDialog.showConfirmDialog(MainActivity.this, "", "还没结束哦,请点击同意进入下一个页面哦= ̄ω ̄=",type);
// dialog.setMonDialogButtonClickListener(new VindicateDialog.OnDialogButtonClickListener() {
// @Override
// public void onPositiveButtonClick(AlertDialog dialog) {
// Intent intent = new Intent(MainActivity.this, VindicateActivity.class);
// startActivity(intent);
// finish(); //关闭当前Activity
// }
//
// @Override
// public void onNegativeButtonClick(AlertDialog dialog) {
// //点击不同意按钮关闭应用
// dialog.dismiss();
// CloseAlertDialogUtils instance = CloseAlertDialogUtils.getInstance();
// CloseAlertDialogUtils.showConfirmDialog(MainActivity.this, "", "小姐姐确定要这么狠心的离开吗?还有惊喜哦,拜托看完好吗~(>﹏<)");
// instance.setMonDialogButtonClickListener(new CloseAlertDialogUtils.OnDialogButtonClickListener() {
// @Override
// public void onClosePositiveButtonClick(AlertDialog dialog) {
// Intent intent = new Intent(MainActivity.this, VindicateActivity.class);
// startActivity(intent);
// finish(); //关闭当前Activity
// }
//
// @Override
// public void onCloseNegativeButtonClick(AlertDialog dialog) {
// int type = 2;
// //点击不同意按钮关闭应用
// dialog.dismiss();
// QuitDialog instance = QuitDialog.getInstance();
// QuitDialog.showConfirmDialog(MainActivity.this, "", "即使不知归期,我也会默默等待,挥手道别,是为了更好的相遇。这次是真的要再见了小姐姐o(*≧▽≦)ツ",type);
// instance.setMonDialogButtonClickListener(new QuitDialog.OnDialogButtonClickListener() {
// @Override
// public void onClosePositiveButtonClick(AlertDialog dialog) {
//
// }
//
// @Override
// public void onCloseNegativeButtonClick(AlertDialog dialog) {
// dialog.dismiss();
// System.exit(0);
// }
// });
// }
// });
// }
// });
//
// }
// }, 10000); // 动画结束后延迟10秒
// }
// });
// 启动动画
animatorSetLeft.start();
animatorSetRight.start();
}
//监听退出
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Utils.exit(MainActivity.this);
return false;
}
return super.onKeyDown(keyCode, event);
}
}
在上面代码中添加星星图片随机出现