Android 吐泡泡动画
时间: 2023-11-02 10:55:07 浏览: 40
可以通过实现一个自定义的 View 来实现 Android 吐泡泡动画。以下是一个简单的实现方式:
1. 创建一个自定义 View,并在构造方法中初始化画笔和一些基本参数:
```java
public class BubbleView extends View {
private Paint mPaint;
private int mBubbleColor;
private float mRadius;
private float mCenterX;
private float mCenterY;
public BubbleView(Context context) {
super(context);
init();
}
public BubbleView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mBubbleColor = Color.RED;
mRadius = 50.0f;
}
...
}
```
2. 在 View 的 onDraw 方法中绘制气泡和气泡上的文字:
```java
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(mBubbleColor);
canvas.drawCircle(mCenterX, mCenterY, mRadius, mPaint);
mPaint.setColor(Color.WHITE);
mPaint.setTextSize(30);
mPaint.setTextAlign(Paint.Align.CENTER);
canvas.drawText("Hello", mCenterX, mCenterY + 10, mPaint);
}
```
3. 在 View 中添加一个 onTouchEvent 方法来处理触摸事件,当用户触摸到气泡时,播放吐泡泡动画:
```java
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (isInsideBubble(event.getX(), event.getY())) {
startBubbleAnimation();
}
break;
default:
break;
}
return super.onTouchEvent(event);
}
private boolean isInsideBubble(float x, float y) {
double distance = Math.sqrt(Math.pow(x - mCenterX, 2) + Math.pow(y - mCenterY, 2));
return distance <= mRadius;
}
private void startBubbleAnimation() {
ValueAnimator animator = ValueAnimator.ofFloat(mRadius, mRadius * 2);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.setDuration(1000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mRadius = (float) animation.getAnimatedValue();
invalidate();
}
});
animator.start();
}
```
在 startBubbleAnimation 方法中,我们使用 ValueAnimator 实现了一个简单的半径变化动画。当用户触摸到气泡时,我们将 mRadius 从原来的半径变为原来的两倍,并且在动画过程中不断调用 invalidate 方法来更新 View。
完整的代码示例可以在我的 GitHub 上找到:https://github.com/zhengcx/AndroidBubbleAnimation。