Android Custom UI Particle Effect
- 2021-12-09 10:01:57
- OfStack
In this article, we share the specific code of Android custom UI particle effect for your reference, the specific content is as follows
1. Explosive entity class
public class Ball {
public int color;// Color
public float x;// Center of Circle x Coordinates
public float y;// Center of Circle y Coordinates
public float r;// Particle radius
public float vX;// Horizontal velocity of particles
public float vY;// Particle y Directional velocity
public float aX;// Horizontal acceleration of particles
public float ay;// Particle y Directional acceleration
}
2. Customize the SplitView class
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.LinearInterpolator;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class SplitView extends View {
private Paint mPaint;
private Bitmap mBitmap;
private float d=3;// Particle diameter
private ValueAnimator mAnimator;
private List<Ball> mBalls=new ArrayList<>();
public SplitView(Context context) {
super(context);
}
public SplitView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public SplitView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint=new Paint();
mBitmap= BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background);
for (int i=0;i<mBitmap.getWidth();i++){
for (int j =0;j<mBitmap.getHeight();j++){
Ball ball=new Ball();
ball.color=mBitmap.getPixel(i,j);
ball.x=i*d+d/2;
ball.y=j*d+d/2;
ball.r=d/2;
// Speed ( -20 , 20 )
ball.vX=(float)(Math.pow(-1,Math.ceil(Math.random()*1000))*20*Math.random());
ball.vY=rangInt(-15,35);
ball.aX=0;
ball.ay=0.98f;
mBalls.add(ball);
}
}
mAnimator=ValueAnimator.ofFloat(0,1);
mAnimator.setRepeatCount(-1);// Infinite number of repetitions
mAnimator.setDuration(2000);// Repetition time
mAnimator.setInterpolator(new LinearInterpolator());
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
upDateBall();
invalidate();// Recall onMeasure,ondraw Method.
}
});
}
private int rangInt(int x,int y){
int max=Math.max(x,y);
int min=Math.min(x,y);
return (int)(min+Math.ceil(Math.random()*(max-min)));
}
private void upDateBall() {
for (Ball ball:mBalls){
ball.x=ball.x+ball.vX;
ball.y=ball.y+ball.vY;
ball.vX+=ball.aX;
ball.vY+=ball.ay;
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.translate(500,500);
for (Ball ball:mBalls){
mPaint.setColor(ball.color);
canvas.drawCircle(ball.x,ball.y,ball.r,mPaint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN)
{
// Trigger animation
mAnimator.start();
}
return super.onTouchEvent(event);
}
}