Android自定义View实现简单水波纹效果
更新时间:2022年08月17日 10:45:58 作者:z真真
这篇文章主要为大家详细介绍了Android自定义View实现简单水波纹效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了Android自定义View实现水波纹效果的具体代码,供大家参考,具体内容如下
效果如下:

原理

控制代码
//这里用的kotlin
//主线程刷新控件
val mHandler = object : Handler() {
override fun handleMessage(msg: Message?) {
waterRippleView.refreshView()
}
//开启动画,开线程,延时刷新period值,画布进行x方向平移
private fun progressAdd() {
isAnimate = true
Thread(Runnable {
while (isAnimate) {
Thread.sleep(100)
mHandler.sendEmptyMessage(0)
}
}).start()
}
//停止动画
private fun progressReduce() {
isAnimate = false
}控件源码:
//java编写
public class WaterRippleView extends View {
private float mWidth;
private float mHeight;
//总周期为2s
private int CIRCLE_PERIOD = 2000;
//振幅,波纹高度
private float ampltitude = 100;
//填充颜色
private int paintColor = 0xff57c011;
//当前时间值,累加并循环
private int period = 0;
private Paint paint;
private Path path;
public WaterRippleView(Context context) {
this(context, null);
}
public WaterRippleView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public WaterRippleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
paint = new Paint();
paint.setColor(paintColor);
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
path = new Path();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
}
public void refreshView() {
period += 100;
if (period > CIRCLE_PERIOD) period %= CIRCLE_PERIOD;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//周期性的移动画布
float offsetX = mWidth / CIRCLE_PERIOD * period;
canvas.translate(-offsetX, 0);
path.reset();
//第一个正弦曲线
path.moveTo(0, mHeight / 2);
path.cubicTo(mWidth / 4, mHeight / 2 - ampltitude,
mWidth * 3 / 4, mHeight / 2 + ampltitude, mWidth, mHeight / 2);
//第二个正弦曲线
path.cubicTo(mWidth * 5 / 4, mHeight / 2 - ampltitude,
mWidth * 7 / 4, mHeight / 2 + ampltitude, 2 * mWidth, mHeight / 2);
//形成闭合路径
path.lineTo(2 * mWidth, mHeight);
path.lineTo(0, mHeight);
path.lineTo(0, mHeight / 2);
canvas.drawPath(path, paint);
}
}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
使用User Agent分辨出Android设备类型的安全做法
这篇文章主要介绍了使用User Agent分辨出Android设备类型的安全做法,本文得出的结论是当你依据检测UA来判断Android手机设备,请同时检查android和mobile两个字符串,需要的朋友可以参考下2015-01-01
Android如何在一个TextView中设置不同字体大小、不同字体颜色封装
在开发过程中遇到过这样一种业务,有很多单行文本字体,字符串中每一部分的字体样式、大小、颜色都不相同,传统的做法是放多个TextView以达到效果,这篇文章主要介绍了android在一个TextView中设置不同字体大小、不同字体颜色封装,需要的朋友可以参考下2024-07-07
Android 中出现java.net.BindException: bind failed: EADDRINUSE 问
这篇文章主要介绍了Android 中出现java.net.BindException: bind failed: EADDRINUSE 问题解决办法的相关资料,需要的朋友可以参考下2017-04-04
Android中使用Toast.cancel()方法优化toast内容显示的解决方法
做程序员的,基本一看api就知道,用这个可以取消上一个toast的显示,然后显示下一个,这样就能解决出现的问题。可是在测试的过程中,发现却没有想象中的那么简单,不信可以百度一下,很多很多人发现toast的cancel()方法不起作用2013-05-05
Android Studio实现音乐播放器的全过程(简单易上手)
这篇文章主要给大家介绍了关于Android Studio实现音乐播放器的相关资料,文中通过实例代码以及图文介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友可以参考下2022-02-02
Android编程实现ListView头部ViewPager广告轮询图效果
这篇文章主要介绍了Android编程实现ListView头部ViewPager广告轮询图效果,较为详细的分析了自定义ListView实现ViewPager广告图轮询的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下2015-10-10
Android Activity的生命周期与启动模式全面解读
虽然说我们天天都在使用Activity,但是你真的对Activity的生命机制完全了解了吗?Activity的生命周期方法只有七个,但是其实那只是默认的情况。也就是说在其他情况下,Activity的生命周期可能不会是按照我们以前所知道的流程,这就要说到Activity的启动模式2021-10-10


最新评论