android ripple 大小,Android Ripple 旋钮水波纹效果(一)
看到android 5.0有一个按钮点击效果非常棒,先来看效果图:
但是这种效果只能在5.0的系统上有效果,如何在低版本上实现呢?
这种效果网上也有人实现了,
blog 地址http://blog.csdn.net/singwhatiwanna/article/details/42614953
ok,直接进入主题,
要实现这种动画效果也不难,原理可以用一句话概括:就是,在我们按下view的时候,从按下的位置开始绘制圆,圆的半径一直增大,直至把View全部覆盖掉。
通过实现原理我们可以分析出,要实现这种效果,需要重写onDraw方法,onTouchEvent方法,如果有必要还需要通过onMeasure方法来获取View的size
1、onDraw方法,就是不断的绘制圆,这里需要循环调用,
2、onTouchEvent方法:通过MotionEvent.ACTION_DOWN和MotionEvent.ACTION_UP做相应的操作并触发onDraw方法
3、onMeasure计算View的size,通过size加上MotionEvent.ACTION_DOWN起始点计算出圆的最大半径
代码实现:
保存view的大小,用于计算绘制 圆的最大半径
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mRect.set(0, 0, getMeasuredWidth(), getMeasuredHeight());
}
手指按下view的时候,计算按下点的位置,并触发onDraw方法
public boolean onTouchEvent(MotionEvent event) {
final int action = MotionEventCompat.getActionMasked(event);
switch (action) {
case MotionEvent.ACTION_DOWN: {
mDrawFinish = false;
int index = MotionEventCompat.getActionIndex(event);
int eventId = MotionEventCompat.getPointerId(event, index);
if (eventId != -1) {
mInitX = (int) MotionEventCompat.getX(event, index);
mInitY = (int) MotionEventCompat.getY(event, index);
updateDrawData();
ViewCompat.postInvalidateOnAnimation(this);
}
return true;
}
更新数据,重新计算圆的半径和步长
private void updateDrawData() {
int radiusLeftTop = (int) Math.sqrt((mRect.left - mInitX) * (mRect.left - mInitX) +
(mRect.top - mInitY) * (mRect.top - mInitY));
int radiusRightTop = (int) Math.sqrt((mRect.right - mInitX) * (mRect.right - mInitX) +
(mRect.top - mInitY) * (mRect.top - mInitY));
int radiusLeftBottom = (int) Math.sqrt((mRect.left - mInitX) * (mRect.left - mInitX) +
(mRect.bottom - mInitY) * (mRect.bottom - mInitY));
int radiusRightBottom = (int) Math.sqrt((mRect.right - mInitX) * (mRect.right - mInitX) +
(mRect.bottom - mInitY) * (mRect.bottom - mInitY));
mRadius = getMax(radiusLeftTop, radiusRightTop, radiusLeftBottom, radiusRightBottom);
mStep = mRadius/mCycle;
}
手指抬起的时候需要做的操做,把步长加大2.5倍,加快圆的绘制
@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = MotionEventCompat.getActionMasked(event);
switch (action) {
//..
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
mStep = (int) (2.5f * mStep);
mDrawBack = true ;
break;
}
return super.onTouchEvent(event);
}
最后就是绘制圆了,这里需要做判断,如果当前绘制的圆半径没有达到我们计算的最大半径,需要继续绘制
@Override
protected void onDraw(Canvas canvas) {
if (mDrawFinish) {
super.onDraw(canvas);
return;
}
canvas.drawColor(0x08000000);
super.onDraw(canvas);
if (mStep == 0) {
return;
}
mDrawRadius = mDrawRadius + mStep;
if (mDrawRadius > mRadius) {
mDrawRadius = 0;
canvas.drawCircle(mInitX, mInitY, mRadius, mRevealPaint);
mDrawFinish = true;
ViewCompat.postInvalidateOnAnimation(this);
return;
}
canvas.drawCircle(mInitX, mInitY, mDrawRadius, mRevealPaint);
ViewCompat.postInvalidateOnAnimation(this);
}
整个效果的实现,相对比较简单,只是很无聊的一直绘圆。
最后要说明一点,如果你想对TextView做这种效果,则继承TextView即可,LinearLayout等其他组件同理;
demo下载
android ripple 大小,Android Ripple 旋钮水波纹效果(一)相关推荐
- html5 水波式按钮_css3+jQuery实现按钮水波纹效果
水波纹按钮 /*自定义按钮样式*/ .btns{ height: 30px; line-height: 30px; text-align: center; width: 200px; color: # ...
- css波纹波动效果,CSS 冲击波(水波纹)效果
实现冲击波--数学知识很重要 *{ margin:0; padding:0; box-sizing:border-box; } html,body{ font-family:"微软雅黑&qu ...
- 【安卓R 源码】Ripple 水波纹效果源码
安卓使用ripple实现点击时的涟漪效果 - 简书 https://www.jb51.net/article/145309.htm Android:RippleDrawable 水波纹/涟漪效果 - ...
- Android开发中的水波纹效果实现
编写不易,如有转载,请声明出处:http://blog.csdn.net/zxc514257857/article/details/73200900 前言 android中的水波纹效果是5.0以后 ...
- android水波纹点击动画,android 控件点击水波纹效果的几种方案
目前我所知道的至少有三种可以实现点击水波纹的效果 第一种:安卓自带的方法 在安卓中有自带的一种属性,可以实现水波纹的效果,就是在所需要点击的控件属性加上如下代码: android:background ...
- Android点击水波纹扩散效果整理(附带一个自定义的水波纹效果控件)
很久很久没有写博客了,说来也有点惭愧.正好最近整理自己的项目工程目录,看到一些值得分享的控件,准备在之后的几篇博客中准备把它们陆续搬运上来. 这篇博客准备整理一下Android Material De ...
- Android 水波纹效果的探究
前言 水波纹效果从Android5.0就已经出来了,基本的使用相信大家都知道了,这里多谈一些相对深层次的使用: 1.基本使用 2.水波纹效果与布局绘制之间的问题 3.长按水波纹扩散效果 4.Butto ...
- android 立体 流量球,Android自定义View——实现水波纹效果类似剩余流量球
Android自定义View--实现水波纹效果类似剩余流量球 三个点 pre ber block span 初始化 move 理解最近突然手痒就想搞个贝塞尔曲线做个水波纹效 ...
- Android 之自定义view实现水波纹效果
在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果,兴致高昂的来找你,看了之后目的很明确,当然就是希望你能给她: 在这样的关键时候,身子板就一定得硬了, ...
最新文章
- 50的阶乘用c语言编写,求10000的阶乘(c语言代码实现)
- Linux yum 命令
- Redis 是单线程凭什么能支撑高并发
- “局部图像特征描述概述”--樊彬老师
- PHP的十个高级技巧
- 利用python自定义完整版迭代器
- python解决xml文件中存在中文文字的问题
- FFT,NTT 专题
- 《寄生虫》横扫奥斯卡,Python告诉你这部电影到底好在哪里?
- cad插件_CAD插件坐标标注安装教程
- 通过Centos7搭建PXE安装Windows操作系统和Centos操作系统及WindowsPE维护系统
- Excel 2010高级应用-饼图(四)
- excel求回归直线方程的公式_如何用excel快速求线性回归方程?
- 域名申请、解析和备案
- java 在pdf中插入图片_新手教程!如何在PDF文件中插入图像
- grafan 6.3.x pannel研究
- 【K210】K210学习笔记七——使用K210拍摄照片并在MaixHub上进行训练
- htm盒子模型与定位
- 计算机网络中的层次结构
- 30+项目经理,少奋斗5年的职业规划路线
热门文章
- 三 虚拟机安装Deepin
- 【强化学习】策略梯度Policy-Gradient
- 【CUDA7.5】MATLAB中配置Win7+Matlab R2015b+CUDA7.5+vs2013配置方法
- 【双边滤波】基于小波变换的多尺度自适应THZ增强双边滤波器的MATLAB仿真
- redis在linux下安装并測试(在spring下调用)
- AS3 鼠标指针样式
- 使用8位字节的编码格式将字节流安全的转换成String
- Object Builder Application Block (2)
- python批量给文件命名为001,002,...【亲测有效】
- leetcode 752. 打开转盘锁 c代码