项目源码比较简单,直接看帖的代码就可以了。

说实话,我是真没有去看RippleView的源码,只是从表面看到它的效果,所以产生了一点思路,所以功能很有局限性,而且用起来也比较复杂,大家且看且喷就好^_^。

大致的思路就是在需要波纹效果的视图上叠加一层View,在下层View需要触发波纹效果时,绘制一个从中心扩散的圆,或从四周往中心收缩的圆,只要控制好透明度和颜色还有绘制频率,即可仿效出RippleView的效果。

下面贴出代码:

package com.ykb.json.customview;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;/*** com.ykb.json.customview* 描述 :简单的水波视图* 作者 : ykb* 时间 : 15/8/12.*/
public class WaveView extends TextView
{private String TAG = getClass().getSimpleName();/*** 延迟重绘的时间 ms*/private static final long DRAW_DELAY_MILLS = 15;/*** 半径的增量*/private static final long RADIUS_INCREMENT_BLOCK = 50;/*** 波纹模式 -扩散*/public static final int WAVE_MOD_SPREAD = 1;/*** 波纹模式 -收缩*/public static final int WAVE_MOD_SHRINK = WAVE_MOD_SPREAD+1;/*** 防止多次加载*/private boolean loadOnce;/*** 画笔*/private Paint mPaint;/*** 屏幕像素密度*/private float density;/*** 占据宽度*/private int width;/*** 占据高度*/private int height;/*** 波纹颜色*/private int waveColor = Color.LTGRAY;/*** 波纹透明度*/private int waveAlph =255;/*** 波纹渲染半径*/private int radius;/*** 是否绘制*/private boolean needDraw;/*** 是否回调最后的波纹颜色*/private boolean changeColor;/*** 波纹模式 {@link #WAVE_MOD_SHRINK}收缩,{@link #WAVE_MOD_SPREAD}扩散*/private int mode=WAVE_MOD_SPREAD;/*** 波纹绘制完成后的回调*/private OnWaveCompleteListener callback;/*** 圆心的横坐标*/private int centerX;/*** 圆心纵坐标*/private int centerY;/*** 是否响应touch事件*/private boolean repTouch;public WaveView(Context context){this(context, null);}public WaveView(Context context, AttributeSet set){this(context, set, 0);}public WaveView(Context context, AttributeSet set, int defaultStyle){super(context, set, defaultStyle);}/*** 设置是否响应touch事件*/public void setRepTouch(boolean repTouch){this.repTouch = repTouch;}/*** 设置是否需要返回颜色* @param changeColor*/public void setChangeColor(boolean changeColor){this.changeColor = changeColor;}/*** 设置波纹展现模式* @param mode {@link #WAVE_MOD_SHRINK}收缩,{@link #WAVE_MOD_SPREAD}扩散*/public void setMode(int mode){this.mode = mode;}/*** 开始绘制*/public void startDraw(){if(!repTouch){centerX=width/2;centerY=height/2;}startInvalidate();}/*** 开始绘制*/private void startInvalidate(){needDraw=true;resetPaint();switch (mode){case WAVE_MOD_SHRINK:radius=width;break;case WAVE_MOD_SPREAD:radius=0;break;}invalidate();}/*** 设置是否可以画** @param needDraw*/public void setNeedDraw(boolean needDraw){this.needDraw = needDraw;}/*** 设置波纹透明度** @param waveAlph*/public void setWaveAlph(int waveAlph){this.waveAlph = waveAlph;}/*** 设置波纹颜色** @param waveColor*/public void setWaveColor(int waveColor){this.waveColor = waveColor;}/*** 设置波浪完成后的回调接口* @param callback*/public void setCallback(OnWaveCompleteListener callback){this.callback = callback;}/*** 初始化*/private void onLayoutInit(){density = getResources().getDisplayMetrics().density;width = getWidth();height = getHeight();mPaint = new Paint();resetPaint();loadOnce = !loadOnce;}/*** 画笔重置*/private void resetPaint(){mPaint.reset();mPaint.setAntiAlias(true);}/*** 清除画布* @param canvas*/private void clearCanvas(Canvas canvas){canvas.restore();}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom){super.onLayout(changed, left, top, right, bottom);if (changed && !loadOnce) {onLayoutInit();}}@Overridepublic boolean onTouchEvent( MotionEvent event){if(!repTouch)return  super.onTouchEvent(event);int action=event.getAction();Log.e("onTouch,action : "+action);if(action==MotionEvent.ACTION_UP){centerX=(int)event.getX();centerY=(int)event.getY();startInvalidate();}return  super.onTouchEvent(event);}@Overridepublic void draw(Canvas canvas){super.draw(canvas);boolean end=false;switch (mode){case WAVE_MOD_SHRINK:if(radius<=0)end=true;break;case WAVE_MOD_SPREAD:if(radius >= width / 2)end=true;break;}if (!needDraw||end) {if(null!=callback&&needDraw&&changeColor) {callback.onWaveComplete(waveColor);}clearCanvas(canvas);return;}if(radius==(mode==WAVE_MOD_SPREAD?0:width))canvas.save();mPaint.setColor(waveColor);mPaint.setAlpha(waveAlph);canvas.drawCircle(centerX, centerY, radius, mPaint);radius += (mode==WAVE_MOD_SPREAD?RADIUS_INCREMENT_BLOCK:-RADIUS_INCREMENT_BLOCK);postInvalidateDelayed(DRAW_DELAY_MILLS);}/**波纹绘制完成的回调接口**/public interface OnWaveCompleteListener{public void onWaveComplete(int color);}
}

代码就是这么简单,在使用的时候只需按自己的需求叠加到相应的控件上,然后设置好相关属性,调用startDraw方法即可。

-布局使用如下

<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/dimen_40"android:layout_marginLeft="@dimen/dimen_40"android:layout_marginRight="@dimen/dimen_40"android:layout_marginTop="@dimen/dimen_40"><Buttonandroid:id="@+id/btn_login_bg"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/title_bg1"/><com.ykb.json.customview.WaveViewandroid:focusable="true"android:focusableInTouchMode="true"android:id="@+id/layout_login"android:layout_width="match_parent"android:layout_height="match_parent"></com.ykb.json.customview.WaveView><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@null"android:text="登  录"android:textColor="@color/white"android:textSize="@dimen/dimen_18"/></RelativeLayout>

-代码使用如下

private void initUI() {layout_login=(WaveView)findViewById(R.id.layout_login);layout_login.setCallback(this);layout_login.setMode(WaveView.WAVE_MOD_SHRINK);layout_login.setChangeColor(true);
}
@Override
public void onClick(View v) {layout_login.startDraw();
}   @Override
public void onWaveComplete(int color){btn_login_bg.setBackgroundColor(color);
}

写完这篇博客后我就去看看RippleView的实现原理,我知道这个波纹效果肯定差它差的太远,但是依然希望有大神提供更好的思路,给我们这些初学者学习更多的自定义View知识。

Android自定义View(四)——仿Android5.0波纹效果相关推荐

  1. android 自定义取色器,【Android自定义View】仿Photoshop取色器ColorPicker(二)

    ColorPicker 一款仿Photoshop取色器的Android版取色器. 前言 上一篇已经简单介绍了ColorPicker的项目结构以及两种颜色空间,接下来我们详细解析一下ColorPicke ...

  2. android代码实现手机加速功能,Android自定义View实现内存清理加速球效果

    Android自定义View实现内存清理加速球效果 发布时间:2020-09-21 22:21:57 来源:脚本之家 阅读:105 作者:程序员的自我反思 前言 用过猎豹清理大师或者相类似的安全软件, ...

  3. Android 抖音爱心动画,Android自定义View实现抖音飘动红心效果

    本文实例为大家分享了Android自定义View实现抖音飘动红心效果的具体代码,供大家参考,具体内容如下 自定义View--抖音飘动红心 效果展示 动画效果 使用自定义view完成红心飘动效果 Vie ...

  4. android自定义radiogroup,Android 自定义View实现任意布局的RadioGroup效果

    前言 RadioGroup是继承LinearLayout,只支持横向或者竖向两种布局.所以在某些情况,比如多行多列布局,RadioGroup就并不适用 . 本篇文章通过继承RelativeLayout ...

  5. android 自定义红心,Android自定义View实现抖音飘动红心效果

    本文实例为大家分享了Android自定义View实现抖音飘动红心效果的具体代码,供大家参考,具体内容如下 自定义View--抖音飘动红心 效果展示 动画效果 使用自定义view完成红心飘动效果 Vie ...

  6. android 自定义加载动画效果,Android自定义View实现loading动画加载效果

    项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. ...

  7. Android自定义view之仿支付宝芝麻信用仪表盘 ---by ccy

    自定义view练习 仿支付宝芝麻信用的仪表盘 对比图: 首先是自定义一些属性,可自己再添加,挺基础的,上代码 <?xml version="1.0" encoding=&qu ...

  8. 自定义xy组 android,Android自定义view之仿支付宝芝麻信用仪表盘示例

    自定义view练习 仿支付宝芝麻信用的仪表盘 对比图: 首先是自定义一些属性,可自己再添加,挺基础的,上代码 接着在构造方法里初始化自定义属性和画笔: private void initAttr(At ...

  9. Android自定义View之仿QQ运动步数进度效果

    文章目录 前言 先看效果图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6e4ddec17933496ea4830fa08d8ffbe5.png?x-oss-pr ...

最新文章

  1. how-to-get-a-job-in-deep-learning
  2. LINQ中的延迟查询特性
  3. python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...
  4. 原生JavaScript实战之搜索框筛选功能
  5. 运行第一个docker容器
  6. iOS 14.5广告跟踪功能使广告商在安卓支出增长21%
  7. rtorrent -- PT机的下载利器
  8. mysql 多个命令行,5.8.2.1在Windows命令行中启动多个MySQL实例
  9. 字符串中单词去多余空格
  10. Ps中 不透明度和填充的区别
  11. 运维分级发布_故障分级和处罚规范-运维必备规章制度
  12. 从远景论坛上学到的完美激活NERO8 NERO9的经验
  13. flex布局中的align-content属性
  14. 外贸邮箱能群发吗?用哪个外贸邮箱发开发信回复率高?
  15. IT项目经理如何正确做好项目实施
  16. HDU 1507 Uncle Tom's Inherited Land(最大匹配+分奇偶部分)
  17. Scene Management --- Culling
  18. 黑白电影变为彩色电影?这个方法分享给你
  19. 副词记忆(I):ly后缀的常用词
  20. DAMA数据管理知识体系简介

热门文章

  1. java c foreach跳出循环_Java foreach循环中的ClassCastException
  2. Python opencv图像处理基础总结(一) 环境搭建 基础操作
  3. Cortex-M55来了,将集成在下一代STM32、Keil MDK等产品中
  4. 初识C++ - 常量表达式函数
  5. Efficiently Solving the Practical Vehicle Routing Problem: A Novel Joint Learning Approach(GCN-NPEC)
  6. Mysql数据库基础知识总复习
  7. FIR数字滤波器的设计
  8. php一次请求完成的过程,QEEPHP一次完整请求的过程(转)
  9. 【CAD 卸载工具,完美彻底卸载清除干净auto系列软件cad max revit maya等各种残留注册表和文件】
  10. chown和chmod区别