可以游的鲤鱼啦。
FindRelativeLayout.java
package com.test.myfishtest;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.PointF;
import android.os.Build;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import androidx.annotation.RequiresApi;
public class FindRelativeLayout extends RelativeLayout {
private Paint paint;
private ImageView ivFish;
private FishDrawAble fishDrawAble;
private float touchX;
private float touchY;
private float ripple;
private int alpha;
public FindRelativeLayout(Context context) {
this(context, null);
}
public FindRelativeLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public FindRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
//ViewGroup 默认是不执行 onDraw
setWillNotDraw(false);
paint = new Paint();
paint.setAntiAlias(true);
paint.setDither(true);
//画点击时的水波纹
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(8);
ivFish = new ImageView(context);
LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ivFish.setLayoutParams(layoutParams);
fishDrawAble = new FishDrawAble();
ivFish.setImageDrawable(fishDrawAble);
addView(ivFish);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setAlpha(alpha);
canvas.drawCircle(touchX, touchY, ripple * 150, paint);
invalidate();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onTouchEvent(MotionEvent event) {
touchX = event.getX();
touchY = event.getY();
paint.setAlpha(100);
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(this,
"ripple", 0, 1f).setDuration(1000);
objectAnimator.start();
makeTrail();
return super.onTouchEvent(event);
}
private void makeTrail() {
//鱼的重心:相对ImageView坐标
PointF fishRelativePoint = fishDrawAble.getMiddlePoint();
//鱼的重心:绝对坐标 -----起始点
PointF fishMiddle = new PointF(ivFish.getX() + fishRelativePoint.x,
ivFish.getY() + fishRelativePoint.y);
//鱼头圆心的坐标-------控制点1
PointF fishHead = new PointF(ivFish.getX() + fishDrawAble.getHeadPoint().x,
ivFish.getY() + fishDrawAble.getHeadPoint().y);
//点击坐标------结束点
PointF touch = new PointF(touchX, touchY);
//控制点坐标 除以2求控制点的坐标
float angle = includeAngle(fishMiddle, fishHead, touch) / 2;
float delta = includeAngle(fishMiddle, new PointF(fishMiddle.x + 1, fishMiddle.y), fishHead);
PointF controlPoint = fishDrawAble.calculatePoint(fishMiddle,
fishDrawAble.getHEAD_RADUS() * 1.6f, angle + delta);
Path path = new Path();
path.moveTo(fishMiddle.x - fis