为了更清晰地说明如何在Android应用中实现表白烟花效果,我们可以按照以下步骤进行:

步骤 1: 创建自定义View

  • 新建Java类:创建一个名为 FireworkView 的自定义 View 类。
  • 初始化Paint对象:用于绘制烟花粒子的颜色和样式。
  • 定义粒子类:创建一个内部类 Particle 来表示每个烟花粒子的状态。
  • 初始化粒子数组:在构造方法中创建一个 ArrayList<Particle> 来存储所有烟花粒子。
  • 绘制粒子:重写 onDraw 方法来绘制每个粒子的位置和颜色。

步骤 2: 布局文件中使用自定义View

  • 创建布局文件:在 res/layout/ 目录下创建一个新的布局文件,例如 activity_main.xml。
  • 添加自定义View:在布局文件中添加 <com.example.FireworkView> 标签,并设置其宽高为 match_parent。

步骤 3: 在Activity中初始化View

  • 设置内容视图:在 MainActivity 的 onCreate 方法中调用 setContentView 方法来设置主界面的布局。
  • 获取自定义View:通过 findViewById 方法获取到 FireworkView 实例。
  • 开始动画:确保自定义View能够持续更新画面,实现烟花效果。

示例代码

FireworkView.java

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

import java.util.ArrayList;

public class FireworkView extends View {
    private Paint paint;
    private ArrayList<Particle> particles;

    public FireworkView(Context context) {
        super(context);
        init();
    }

    public FireworkView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        particles = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            Particle particle = new Particle();
            particle.x = getWidth() / 2;
            particle.y = getHeight();
            particle.life = 100;
            particle.lifeRemaining = 100;
            particle.velocityX = (float) (Math.random() * 20 - 10);
            particle.velocityY = (float) (Math.random() * -20);
            particle.color = Color.rgb((int) (Math.random() * 256), (int) (Math.random() * 256), (int) (Math.random() * 256));
            particles.add(particle);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (Particle p : particles) {
            if (p.lifeRemaining > 0) {
                p.lifeRemaining--;
                p.x += p.velocityX;
                p.y += p.velocityY;
                p.velocityY += 0.2f; // 重力效果
                paint.setColor(p.color);
                canvas.drawCircle(p.x, p.y, 2, paint);
            }
        }
        postInvalidateDelayed(16); // 每16毫秒重绘一次
    }

    private static class Particle {
        float x, y, velocityX, velocityY, lifeRemaining;
        int life, color;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.example.FireworkView
        android:id="@+id/firework_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import com.example.FireworkView;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FireworkView fireworkView = findViewById(R.id.firework_view);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.