Android自定义View实现简单水波纹效果
更新时间:2022年08月17日 10:45:58 作者:z真真
这篇文章主要为大家详细介绍了Android自定义View实现简单水波纹效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
本文实例为大家分享了Android自定义View实现水波纹效果的具体代码,供大家参考,具体内容如下
效果如下:
原理
控制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //这里用的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 } |
控件源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | //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); } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
android使用 ScrollerView 实现 可上下滚动的分类栏实例
本篇文章主要介绍了android使用 ScrollerView 实现 可上下滚动的分类栏实例,具有一定的参考价值,有兴趣的可以了解一下。2017-01-01Android 百度地图定位实现仿钉钉签到打卡功能的完整代码
这篇文章主要介绍了Android 百度地图定位实现仿钉钉签到打卡功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-04-04
最新评论