单个水波纹扩散

布局

    <com.ee.MyWaveD
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </com.ee.MyWaveD>

package com.ee;

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 MyWaveD extends View {
    public MyWaveD(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    private Paint paint;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()) {
        /*
         * 当按下的时候开始绘制圆环水波纹
         */
        case MotionEvent.ACTION_DOWN:
            // 1. 设置圆心
            startX = event.getX();
            startY = event.getY();

            // 2.根据圆心创建新的圆
            initView();

            // 3.绘制
            invalidate();

            break;

        default:
            break;
        }
        return true;
    }

    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            // 1.透明度改变-小
            int alpha = paint.getAlpha();
            alpha -= 5;
            if (alpha < 0) {
                alpha = 0;
            }
            // 透明度:0~255之间
            paint.setAlpha(alpha);

            // 2.半径变大
            radius += 5;
            paint.setStrokeWidth(radius / 3);

            // 3.再次绘制一个,执行onDraw方法
            invalidate();
        };
    };

    /*
     * 第一步、构造器
     */

    /**
     * 初始化View
     */
    private int radius;// 半径

    private void initView() {
        paint = new Paint();
        // 设置颜色
        paint.setColor(Color.RED);
        // 设置抗锯齿
        paint.setAntiAlias(true);
        // 设置圆环样式
        paint.setStyle(Style.STROKE);
        // 半径为5
        radius = 5;
        paint.setStrokeWidth(radius / 3);

    }

    // 圆形坐标
    private float startX;
    private float startY;

    /**
     * 绘制环形水波纹
     */
    @Override
    protected void onDraw(Canvas canvas) {
        if (paint.getAlpha() > 0) {
            if (startX > 0 && startY > 0) {
                // 绘制一个圆环
                canvas.drawCircle(startX, startY, radius, paint);
                // 绘制的同时,发送一个延迟消息
                handler.sendEmptyMessageDelayed(0, 50);
            }
        }
    }
}
时间: 2024-11-02 10:01:07

单个水波纹扩散的相关文章

多个彩色水波纹扩散效果

布局 <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=

单个水波纹

paint的使用 <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:co

Android 水波纹点击效果(Ripple Effect)

上周Android发布了Android M的Preview版本.但想必Android5.0很多炫酷效果,多数开发者还没有使用过,那更不要说广大用户了. 本文介绍的是Android5.0中其中一个炫酷的效果,点击水波纹扩散效果(Ripple Effect). 以下介绍的实现方式都是调用Android5.0的新API,并非自定义实现,所以支持在Android5.0的设备. 而大家想兼容低系统版本的话,就需要新建v21(即Android5.0)的Resource Directory. 圆角背景的水波纹

水波纹(water ripple)

demo下载 水波纹,鼠标点击后水会四散,产生涟漪的感觉,十分真实. 实现原理: 扩散:当你投一块石头到水中,你会看到一个以石头入水点为圆心所形成的一圈圈的水波,这里,你可能会被这个现象所误导,以为水波上的每一点都是以石头入水点为中心向外扩散的,这是错误的.实际上,水波上的任何一点在任何时候都是以自己为圆心向四周扩散的,之所以会形成一个环状的水波,是因为水波的内部因为扩散的对称而相互 抵消了. 衰减:因为水是有阻尼的,否则,当你在水池中投入石头,水波就会永不停止的震荡下去. 水的折射:因为水波上

Android L中水波纹点击效果的实现

博主参加了2014 CSDN博客之星评选,帮我投一票吧. 点击给我投票 前言 前段时间android L(android 5.0)出来了,界面上做了一些改动,主要是添加了若干动画和一些新的控件,相信大家对view的点击效果-水波纹很有印象吧,点击一个view,然后一个水波纹就会从点击处扩散开来,本文就来分析这种效果的实现.首先,先说下L上的实现,这种波纹效果,L上提供了一种动画,叫做Reveal效果,其底层是通过拿到view的canvas然后不断刷新view来完成的,这种效果需要view的支持,

Android Ripple 按钮水波纹效果(二)优化

上一篇中我们讲了自定义ripple 水波纹效果,先来回顾一下效果吧! 看了以后感觉没甚么问题,我一开始也觉得很满意了,那好,我们拿Android 5.0自带的效果来对比一下 发现了不同之处没?点击中间的时候是看不出什么区别,但是点击两边的时候,就很明显了,我们自定义的效果,波纹向两边同速度的扩散,所以就会出现,如果点击点不在中心的时候,距离短的一边波纹先到达,而距离长的一边后到达,不能同时到达边缘!而系统自带的则不存在这种情况,所以这是一个优化点;另一个优化点是:我们自定义的效果,在波纹全部覆盖

Android 颜色渲染(七) RadialGradient 环形渲染实现水波纹效果

版权声明:本文为博主原创文章,未经博主允许不得转载. 利用环形渲染我们可以做到什么? 其实很多都是非常常见的,比如上一篇实现的帮帮糖效果, 彩色的热气球,比如这里要讲到的水波纹效果,或者也可以理解为扩散色渲染效果 首先看一下效果图: 轻触屏幕,即可看到对应的效果,可以看到,实现这种效果,利用RadialGradient ,只需简单几行代码: MainActivity: [java] view plain copy package com.tony.testshader; import andro

canvas水波纹效果

先看效果 演示效果 自然界中水波纹效果十分麻烦,我这里只是根据水波纹的几个特性,在理想环境下模拟水波纹的扩散效果. 这里应用到的属性有:扩散.波动.折射. 扩散:很好理解,水波纹会从触发原点开始向周围扩散 波动:水波纹就一直波,在切面上观看,就是一个正弦函数的波形图 折射:光在不同介质中传播速度不同导致出现折射效果. 如果在平静条件下,在垂直方向上看水底事物,很正常. 在波动条件下,因为水的上下波动,导致垂直方向上看到的水底物体,因为波的角度不同,导致水下事物反射的光到人眼的时候,出现一些偏移.

三角函数之美-水波纹加载LoadingView

一.前言 学习是要总结的,最近几天学习了绘图相关的,但是使用的机会较少,现在又快要遗忘了,这次看了水波纹的绘制,觉得十分有意思,还是 把实现的方法记录下来.技术无他,为手熟尔,还是要多练习,空淡误国,实干兴邦,让我们看看今天的三角函数之美吧. 二.概述 肯定大家对中学学习的三角函数都不陌生吧,不过学习的sin.cos是超越函数一类函数,是初等函数的一种,借用维基百科的一张图: 一个完整的正弦函数应该是这样的:>y=Asin(ωx+φ)+h,A决定峰值,ω决定周期,φ表示初相位,h表示y轴的位置.