关于 Android 的水波纹效果小编之前给大家也分享几篇类似的,有兴趣可通过下面的相关文章进行查看,今天给大家再分享一个华丽的水波纹效果,这个效果很不错,感兴趣的可以参考借鉴。
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
先来看看效果
实现效果
模拟水波纹的效果: 点击屏幕就有圆环出现, 半径从小到大, 透明度从大到小 (0 为透明)
实现思路
1. 自定义类继承 View。
2. 定义每个圆环的实体类 Wave,并初始化绘制圆环的画笔的数据。
3. 重写 onTouchEvent 方法,down 时,获得坐标点,做为圆环圆心。
4. 发送 handler 信息,对数据进行修改,刷新页面。
5. 重写 onDraw 方法,绘制一个圆环。
1. 自定义类继承 View
新建 WaterWaveView2 类继承 View
- public class WaterWaveView2 extends View {
- //存放圆环的集合
- private ArrayList<Wave> mList;
- //界面刷新
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- invalidate();//刷新界面,会执行onDraw方法
- }
- };
- public WaterWaveView2(Context context) {
- this(context, null);
- }
- public WaterWaveView2(Context context, AttributeSet attrs) {
- super(context, attrs);
- mList = new ArrayList<Wave>();
- }
2. 定义实体类 Wave
- /**
- * Created by HongJay on 2016/8/30.
- * 把wave的数据封装成一个对象
- */
- public class Wave {
- public float x; //圆心x坐标
- public float y; //圆心y坐标
- public Paint paint; //画圆的画笔
- public float width; //线条宽度
- public int radius; //圆的半径
- public int ranNum; //随机数
- public int[] randomColor = {
- Color.BLUE,
- Color.CYAN,
- Color.GREEN,
- Color.MAGENTA,
- Color.RED,
- Color.YELLOW
- };
- public Wave(float x, float y) {
- this.x = x;
- this.y = y;
- initData();
- }
- /**
- * 初始化数据,每次点击一次都要初始化一次
- */
- private void initData() {
- paint = new Paint(); //因为点击一次需要画出不同的圆环
- paint.setAntiAlias(true); //打开抗锯齿
- ranNum = (int)(Math.random() * 6); //[0,5]的随机数
- paint.setColor(randomColor[ranNum]); //设置画笔的颜色
- paint.setStyle(Paint.Style.STROKE); //描边
- paint.setStrokeWidth(width); //设置描边宽度
- paint.setAlpha(255); //透明度的设置(0-255),0为完全透明
- radius = 0; //初始化
- width = 0;
- }
- }
3. 重写 onTouchEvent 方法
获得圆心,并且删除集合中透明度为 0 的圆环,通知 handler 调用
方法
- onDraw()
- public boolean onTouchEvent(MotionEvent event) {
- super.onTouchEvent(event);
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- float x = event.getX();
- float y = event.getY();
- deleteItem();
- Wave wave = new Wave(x, y);
- mList.add(wave);
- //刷新界面
- invalidate();
- break;
- case MotionEvent.ACTION_MOVE:
- float x1 = event.getX();
- float y1 = event.getY();
- deleteItem();
- Wave wave1 = new Wave(x1, y1);
- mList.add(wave1);
- invalidate();
- break;
- }
- //处理事件
- return true;
- }
- //删除透明度已经为0的圆环
- private void deleteItem(){
- for (int i = 0; i <mList.size() ; i++) {
- if(mList.get(i).paint.getAlpha()==0){
- mList.remove(i);
- }
- }
- }
- }
4. 重写 onDraw() 方法,循环绘制圆环
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- //避免程序一运行就进行绘制
- if (mList.size() > 0) {
- //对集合中的圆环对象循环绘制
- for (Wave wave : mList) {
- canvas.drawCircle(wave.x, wave.y, wave.radius, wave.paint);
- wave.radius += 3;
- //对画笔透明度进行操作
- int alpha = wave.paint.getAlpha();
- if (alpha < 80) {
- alpha = 0;
- } else {
- alpha -= 3;
- }
- //设置画笔宽度和透明度
- wave.paint.setStrokeWidth(wave.radius / 8);
- wave.paint.setAlpha(alpha);
- //延迟刷新界面
- mHandler.sendEmptyMessageDelayed(1, 100);
- }
- }
- }
总结
以上就是 Android 实现自定义水波纹效果的全部内容,怎么样?实现的效果不错吧,感兴趣的小伙伴们快快自己动手实践起来,希望这篇文章对大家的学习和工作能有所帮助。
来源: http://www.phperz.com/article/17/0320/292090.html