zoukankan      html  css  js  c++  java
  • 多个彩色水波纹扩散效果

     布局

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >
    
        <com.ee.MyWave
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </com.ee.MyWave>
    
    </RelativeLayout>

    package com.ee;
    
    import java.util.ArrayList;
    
    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 MyWave extends View {
        /**
         * 定义一个水波浪类(一个圆环包括圆心、半径、画笔(需要绘制))
         */
        private class Wave {
            // 圆心
            int pointX;
            int pointY;
            // 半径
            int radius;
            // 画笔
            Paint paint;
        }
    
        // 二个相临波浪中心点的最小距离
        private static final int DIS_SOLP = 13;
        // 是否有水波浪
        protected boolean isRunning = false;
    
        /**
         * 第一步构造器
         */
        // 定义水波纹的集合
        private ArrayList<Wave> wList;
    
        public MyWave(Context context, AttributeSet attrs) {
            super(context, attrs);
            // 初始化创建水波纹集合
            wList = new ArrayList<MyWave.Wave>();
        }
    
        /**
         * touch事件
         */
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            super.onTouchEvent(event);
    
            switch (event.getAction()) {
            // 按下屏幕、滑动都可以产生水波
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                // 得到down、move的圆心
                int x = (int) event.getX();
                int y = (int) event.getY();
                // 如果水波纹集合为空,就绘制一个水波纹
                if (wList.size() == 0) {
                    // 绘制水波纹
                    addPoint2List(x, y);
                    // 修改状态,说明水波生成
                    isRunning = true;
                    // 此刻发送一个消息,说明绘制了一个水波
                    handler.sendEmptyMessage(0);
                } else {
                    // 如果水波集合不为空,就去最后一个绘制的环形水波
                    Wave w = wList.get(wList.size() - 1);
    
                    if (Math.abs(w.pointX - x) > DIS_SOLP
                            || Math.abs(w.pointY - y) > DIS_SOLP) {
                        addPoint2List(x, y);
                    }
                }
                ;
                break;
    
            default:
                break;
            }
            return true;
        }
    
        /*
         * 定义4种色彩的水波
         */
        private int[] colors = new int[] { Color.BLUE, Color.RED, Color.YELLOW,
                Color.GREEN };
    
        /**
         * 添加波浪
         */
        private void addPoint2List(int x, int y) {
            // 创建一个水波类
            Wave w = new Wave();
            // 将滑动或者按下时候的坐标赋值给水波类
            w.pointX = x;
            w.pointY = y;
            // 创建画笔
            Paint pa = new Paint();
            // 画出水波(环形)设置颜色,抗锯齿,形状
            pa.setColor(colors[(int) (Math.random() * 4)]);
            pa.setAntiAlias(true);
            pa.setStyle(Style.STROKE);
            // 赋值
            w.paint = pa;
            // 往集合中添加一个环形水波
            wList.add(w);
        }
    
        /**
         * 绘制水波纹
         */
        @Override
        protected void onDraw(Canvas canvas) {
            for (int i = 0; i < wList.size(); i++) {
                Wave wave = wList.get(i);
                canvas.drawCircle(wave.pointX, wave.pointY, wave.radius, wave.paint);
            }
        }
    
        /*
         * 运用消息机制
         */
        private Handler handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                // 接受到发送过来的消息进行相应的操作
                // 刷新数据
                flushData();
                // 刷新页面
                invalidate();
                // 循环动画
                if (isRunning) {
                    handler.sendEmptyMessageDelayed(0, 50);
                }
    
            };
        };
    
        /**
         * 刷新数据(操作环形水波的透明度以及半径变化)
         */
        private void flushData() {
    
            for (int i = 0; i < wList.size(); i++) {
    
                Wave w = wList.get(i);
    
                // 如果透明度为 0 从集合中删除
                int alpha = w.paint.getAlpha();
                if (alpha == 0) {
                    wList.remove(i);
                    continue;
                }
                // 每次透明度值减5
                alpha -= 5;
                if (alpha < 5) {
                    alpha = 0;
                }
                // 降低透明度
                w.paint.setAlpha(alpha);
    
                // 扩大半径
                w.radius = w.radius + 3;
                // 设置半径厚度
                w.paint.setStrokeWidth(w.radius / 3);
            }
    
            /*
             * 如果集合被清空,就停止刷新动画
             */
            if (wList.size() == 0) {
                isRunning = false;
            }
        }
    }
  • 相关阅读:
    数组
    js--函数
    for循环
    运算符
    js 正则表达式
    js DOM节点
    js 字符串
    js 函数
    2018-12-26 课堂笔记 for循环
    2018-12-25 课堂笔记 js
  • 原文地址:https://www.cnblogs.com/3674-it/p/5481767.html
Copyright © 2011-2022 走看看