效果展示
代码实现
public class WaveView1 extends View {
private Paint mPaint;
private int ww = 400;
private int wh = 50;
private int dx;
//private Handler handler = new Handler(Looper.getMainLooper());
public WaveView1(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
mPaint.setColor(Color.BLUE);
mPaint.setDither(true);
mPaint.setAntiAlias(true);
//ss();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
dx+=5;
if(dx>=ww){
dx = 0;
}
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("twy",dx+"");
flag = true;
postInvalidate();
}
}
}).start();
}
private boolean flag;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(flag){
Path path = new Path();
int x1 = -dx;
path.moveTo(x1,300);
while (x1<=getWidth()){
path.quadTo(x1+ww/4,300-wh,x1+ww/2,300);
path.quadTo(x1+ww/4*3,300+wh,x1+ww,300);
x1+=ww;
}
path.lineTo(getWidth(),getHeight());
path.lineTo(0,getHeight());
path.close();
canvas.drawPath(path,mPaint);
}
}
@SuppressLint("WrongConstant")
private void ss(){
ValueAnimator animator = ValueAnimator.ofInt(0, ww);
animator.setDuration(300);
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.setInterpolator(new LinearInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
dx = (int) animation.getAnimatedValue();
flag = true;
postInvalidate();
}
});
animator.start();
}
}
动画实现思路
仅供学习之用