水波灵纹

本文介绍如何自定义一个Android视图组件实现动态水波纹效果。通过触摸事件触发并绘制不同透明度和大小变化的圆形来模拟水波扩散过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、自定义一个类用来画图


package com.bwei.waterwave;


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class WaterWaveViewWithMove extends View {

    private Wave wave;  
    private List<Wave> wavesList;  
    private boolean isRunning;  
    private int xSlop = 10, ySlop = 10;  
      
    public WaterWaveViewWithMove(Context context) {  
        super(context);  
        wavesList = new ArrayList<WaterWaveViewWithMove.Wave>();  
    }  
      
    public WaterWaveViewWithMove(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        wavesList = new ArrayList<WaterWaveViewWithMove.Wave>();  
    }  
      
    private Handler handler = new Handler() {  
        public void handleMessage(android.os.Message msg) {  
            for (Iterator iterator = wavesList.iterator(); iterator.hasNext();) {  
                Wave wave = (Wave) iterator.next();  
                  
                //透明度 越低越透明  
                int alpha = wave.paint.getAlpha() - 5;  
                if (alpha < 0) {  
                    iterator.remove();  
                    continue;  
                }  
                  
                //圆的半径变大  
                wave.radius += 10;  
                  
                //圆环的半径变小  
                wave.paint.setStrokeWidth(wave.radius / 6); //轮廓宽度  
                wave.paint.setAlpha(alpha);  
                  
            }  
            if (wavesList.size() == 0) {  
                isRunning = false;  
            }  
              
            invalidate();  
            if (isRunning) {  
                handler.sendEmptyMessageDelayed(0, 50);  
            }  
        };  
    };  
      
    @Override  
    protected void onDraw(Canvas canvas) {  
        super.onDraw(canvas);  
        for (Iterator iterator = wavesList.iterator(); iterator.hasNext();) {  
            Wave wave = (Wave) iterator.next();  
            if (wave.paint.getAlpha() > 0) { //透明度大>0 才绘制  
                canvas.drawCircle(wave.x, wave.y, wave.radius, wave.paint);  
            }  
        }  
    }  
      
    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        switch (event.getAction()) {  
        case MotionEvent.ACTION_DOWN:  
        case MotionEvent.ACTION_MOVE:  
            if (wavesList.size() == 0) {  
                isRunning = true;  
                handler.sendEmptyMessageDelayed(0, 50); //发送消息后,handler遍历wavesList 循环更新  
            }  
            //若不在上面的if里发送msg,会:手指down|move时 都会更新一下view  
//          handler.sendEmptyMessageDelayed(0, 50);  
          
            float x = event.getX();  
            float y = event.getY();  
            //当前点的x或y与最后有效点的x或y距离大于slop值 才添加新的wave  
            if (wavesList.size() > 0) {  
                if (Math.abs(x - wavesList.get(wavesList.size() - 1).x) > xSlop  
                        || Math.abs(y - wavesList.get(wavesList.size() - 1).y) > ySlop) {  
                    wave = new Wave();  
                    wave.x = x;  
                    wave.y = y;  
                    wave.resetPaint();//重写设置一次画笔  
                    wavesList.add(wave);  
                }  
            } else {  
                wave = new Wave();  
                wave.x = x;  
                wave.y = y;  
                wave.resetPaint();//重写设置一次画笔  
                wavesList.add(wave);  
            }  
              
            break;  
        case MotionEvent.ACTION_UP:  
              
            break;  
 
        default:  
            break;  
        }  
        return true;  
    }  
      
      
    /**
     * 随机颜色
     * @return
     */  
    private int getColor() {  
        StringBuilder sb = new StringBuilder();  
        Random random = new Random();  
        String temp;  
        for (int i = 0; i < 3; i++) {  
            temp = Integer.toHexString(random.nextInt(0xFF));  
            if (temp.length() == 1) {  
                temp = "0" + temp;  
            }  
            sb.append(temp);  
        }  
        return Color.parseColor("#" + sb.toString());  
    }  
      
    private class Wave {  
        private float x, y, radius;  
        private Paint paint;  
          
        private void resetPaint() {  
            paint = new Paint();  
            paint.setAntiAlias(true);//抗锯齿  
            paint.setStyle(Style.STROKE);//绘制轮廓  
            paint.setColor(getColor());//随机颜色  
        }  
    }  
    
    

}


2、布局文件中 引用一下

 <com.bwei.waterwave.WaterWaveViewWithMove
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

3、MainActivity中不用写东西










一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值