自定义view实现拉勾网水波纹效果

github链接:https://github.com/yestin0303/WaveView
该效果可以用2个二阶贝塞尔曲线完成,关于贝塞尔曲线,网上文章很多,不在详述,下面直接上代码,

public class WaveView extends View {
 Path path;
 Paint paint;
 Path pathback;
 Paint paintback;
 int screen_width;
 int screen_height;
 int dx;
 int itemLength;
 int controlLength;

 public WaveView(Context context) {
 this(context, null);
 }

 public WaveView(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
 }

 public WaveView(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 WindowManager wm = (WindowManager) context
 .getSystemService(Context.WINDOW_SERVICE);
 screen_width = wm.getDefaultDisplay().getWidth();
 screen_height = wm.getDefaultDisplay().getHeight();
 itemLength = screen_height;
 path = new Path();
 paint = new Paint();
 paint.setColor(Color.parseColor("#B9EBDF"));
 paint.setStyle(Paint.Style.FILL_AND_STROKE);

 pathback = new Path();
 paintback = new Paint();
 paintback.setColor(Color.parseColor("#00B388"));
 paintback.setStyle(Paint.Style.FILL_AND_STROKE);
 }

 @Override
 protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 path.reset();
 pathback.reset();
 controlLength = itemLength / 4;
 path.moveTo(-itemLength + dx, 500);
 pathback.moveTo((float) (-itemLength * 1.25+ dx), 500);

 drawWave(canvas, path, paint);
 drawWave(canvas, pathback, paintback);
 }

 public void drawWave(Canvas canvas, Path drawpath, Paint drawpaint) {
 for (int i = 0; i <= screen_width / itemLength + 2; i++) {
 drawpath.rQuadTo(controlLength, 30, itemLength / 2, 0);
 drawpath.rQuadTo(controlLength, -30, itemLength / 2, 0);
 }
 drawpath.lineTo(screen_width, 0);
 drawpath.lineTo(0, 0);
 drawpath.close();
 canvas.drawPath(drawpath, drawpaint);
 }

 public void startAnim() {
 ValueAnimator animator = ValueAnimator.ofInt(0, itemLength);
 animator.setDuration(25000);
 //设置动画无限循环
 animator.setRepeatCount(ValueAnimator.INFINITE);
 animator.setInterpolator(new LinearInterpolator());
 animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
 @Override
 public void onAnimationUpdate(ValueAnimator animation) {
 dx = (int) animation.getAnimatedValue();
 postInvalidate();
 }
 });
 animator.start();
 }
}
public class MainActivity extends AppCompatActivity {
 WaveView waveView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 waveView = (WaveView) findViewById(R.id.mywave);
 waveView.startAnim();
 }
}

效果如下,

GIF.gif
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 180,476评论 25赞 708
  • 贝塞尔曲线开发的艺术 一句话概括贝塞尔曲线:将任意一条曲线转化为精确的数学公式。 很多绘图工具中的钢笔工具,就是典...
    eclipse_xu阅读 28,065评论 38赞 370
  • (接上篇)上一章《惑18》 这小子终于知道动脑子了,哈哈! 你只看见我变成了这个样子,你没看见我都经历了什么! 贺...
    生活就是咚咚锵阅读 826评论 19赞 22
  • 一个冬天 她也要温度 一个冬天 她也怕冷 所以她摘下了所有枯叶 做了一件金黄色的衣裳 冬天说,我也想要手套 于是,...
    梦梦cute萌阅读 349评论 0赞 2
  • 睡前造梦者阅读 252评论 0赞 0

友情链接更多精彩内容