最近公司做的项目中,需要用到一个动态的气泡效果,气泡是可以收缩和扩散的。本着拿来用的精神去度娘上找,大都是一些下雪、下雨的效果,不是我想要的,只能自己造轮子。虽然网上的资料没什么用,但也给了我一些灵感。下面是我磨出的一点东西,先看下效果图:
不会弄gif动图,大家凑合着看下,效果还是可以的。接着咱们看代码:
1.首先是一个气泡的类,初始化时会完成一系列计算,确定气泡的基本信息:
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.view.animation.LinearInterpolator;
import java.util.Random;
public class BubbleObject {
private int initX;//初始位置X
private int initY;//初始位置Y
private int radius;//气泡半径
private long time;//一次运动所需时间
private int currentX;//当前位置X
private int currentY;//当前位置Y
private int stopX;//结束位置X
private int stopY;//结束位置Y
private int alpha;//透明度
private int red, green, blue; // 颜色
private boolean isDiffusion;//是否扩散
private long delay;// 开始时延
/***
* @param width view.width
* @param height view.height
* @param isDiffusion 是否扩散
*/
public BubbleObject(int width,
int height,
int red,
int green,
int blue,
boolean isDiffusion) {
//产生随机数
Random random = new Random();
//周长
int perimeter = 2 * width + 2 * height;
//在周长上随机产生的数
int randomNum = random.nextInt(perimeter);
//确定起始坐标和结束坐标,颜色
this.isDiffusion = isDiffusion;
if (isDiffusion) {
alpha = 255;
initX = width / 2;
initY = height / 2;
if (randomNum < width) {
stopX = randomNum;
stopY = 0;
} else if (randomNum < width + height) {
stopX = width;
stopY = randomNum - width;
} else if (randomNum < 2 * width + height) {
stopX = 2 * width - randomNum + height;
stopY = height;
} else {
stopX = 0;
stopY = perimeter - randomNum;
}
} else {
alpha = 0;
stopX = width / 2;
stopY = height / 2;
if (randomNum < width) {
initX = randomNum;
initY = 0;
} else if (randomNum < width + height) {
initX = width;
initY = randomNum - width;
} else if (randomNum < 2 * width + height) {
initX = 2 * width - randomNum + height;