android 水波纹

public class MyWaveView extends View{

    private ArrayList<Wave> list;
    private int[] colors = {Color.RED,Color.BLUE,
            Color.DKGRAY,Color.GREEN,Color.YELLOW};
    public boolean isRunning = false;

    public MyWaveView(Context context) {
        this(context,null);
    }

    public MyWaveView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MyWaveView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        list = new ArrayList<MyWaveView.Wave>();

    }

    //用户用手触摸时触发
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
            int x = (int) event.getX();
            int y = (int) event.getY();

            //创建水波纹,并放到集合中;
            addWave(x, y);
            break;
        default:
            break;
        }
        return true;
    }

    public void addWave(int x,int y ){
        Wave wave = new Wave();
        //确定圆心
        wave.rX = x;
        wave.rY = y;
        //确定半径 radius: 0--->

        Paint paint = new Paint();
        paint.setColor(colors[(int)(Math.random()*5)]);
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        wave.paint = paint;
        addWaveToList(wave,x,y);
    }

    private void addWaveToList(Wave wave,int x,int y) {
        if(list.size() == 0){
            list.add(wave);
            isRunning = true;
            handler.sendEmptyMessage(0);
        }else{
            if(Math.abs(x - (list.get(list.size() -1)).rX) > 50
                    || Math.abs(y - (list.get(list.size() -1)).rY) > 50){
                list.add(wave);
            }
        }

    }

    Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            refreshPaint();
            invalidate();

            if(isRunning){
                handler.sendEmptyMessageDelayed(0, 18);
            }
        };
    };

    private void refreshPaint(){
        for(int i = 0;i< list.size();i++){
            Wave wave = list.get(i);
            wave.radius += 4;

            int alpha = wave.paint.getAlpha();

            alpha -= 5;
            if(alpha < 5 ){
                alpha = 0;
            }
            wave.paint.setAlpha(alpha);
            if(alpha == 0){
                list.remove(i);

            }
            wave.radius = wave.radius + 3;
            wave.paint.setStrokeWidth(wave.radius/3);

            if(list.size() == 0){
                isRunning = false;
            }
        }
    }

    //水波纹对象
    public class Wave{
        public int radius;
        public int rX;
        public int rY;
        public Paint paint;

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        for(int i = 0; i < list.size();i++ ){
            Wave wave = list.get(i);
            canvas.drawCircle(wave.rX, wave.rY, wave.radius, wave.paint);
        }
    }
}
时间: 2024-10-14 09:08:12

android 水波纹的相关文章

android: Android水波纹点击效果

Android API 21及以上新增了ripple标签用来实现水波纹的效果.我们可以通过设置ripple背景来实现一些View点击效果. 该水波纹效果有两种:一种是有界的(点击后类似于一个矩形向四周扩展),一种是无界的(点击后类似于一个圆形向四周扩展). 系统上的实现效果如下: 有界效果:在API 21以上使用,才有波纹效果:API 21以下使用只有变色效果,没有波纹效果. android:background="?android:attr/selectableItemBackground&q

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

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

android 水波纹效果实现

1.在drawable文件下,新建seletor,作为button的背景,这里我用的是两个圆角的shape <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/shape_bt

Android -- 贝塞尔实现水波纹动画(划重点!!)

1,昨天看到了一个挺好的ui效果,是使用贝塞尔曲线实现的,就和大家来分享分享,还有,在写博客的时候我经常会把自己在做某种效果时的一些问题给写出来,而不是像很多文章直接就给出了解决方法,这里给大家解释一下,这里写出我遇到的一些问题不是为了凑整片文章的字数,而是希望大家能从根源下知道它是怎么解决的,而不是你直接百度搜索这个问题解决的代码,好了,说了这么多,只是想告诉大家,我后面会在过程中提很多问题(邪恶脸,嘿嘿嘿),好吧,来看看今天的效果: 2,what is the fuck?,这就是你说的很好看

Android 实现RippleEffect水波纹效果

最近看到360.UC.网易新闻客户端都应用了水波纹效果,就在私下里也研究了一下,参照GIT上大神的分享,自己也跟着做了一个示例,下面先看效果: 1.RippleEffect核心实现类 package com.example.RippleEffect; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphi

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

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

Android自定义水波纹动画Layout

Android自定义水波纹动画Layout 源码是双11的时候就写好了,但是我觉得当天发不太好,所以推迟了几天,没想到过了双11女友就变成了前女友,桑心.唉不说了,来看看代码吧. 展示效果 Hi前辈 话不多说,我们先来看看效果: 这一张是<Hi前辈>的搜索预览图,你可以在这里下载这个APP查看更多效果:http://www.wandoujia.com/apps/com.superlity.hiqianbei LSearchView 这是一个MD风格的搜索框,集成了ripple动画以及searc

Android特效专辑(十)——点击水波纹效果实现,逻辑清晰实现简单

Android特效专辑(十)--点击水波纹效果实现,逻辑清晰实现简单 这次做的东西呢,和上篇有点类似,就是用比较简单的逻辑思路去实现一些比较好玩的特效,最近也是比较忙,所以博客更新的速度还得看时间去推演,但是也能保证一周三更的样子,现在也还是以小功能,或者说是一些小入门级别的博客为主,我也不算是什么很厉害的人,很多细节的支持处理的仍然还是不到位,所以也是一直在弥补,话不多说,来看看今天的效果 实现起来很简单吧,那我们就来看一下他是怎么实现的咯! OnclickRuning package com

[转]Android自定义控件系列五:自定义绚丽水波纹效果

出处:http://www.2cto.com/kf/201411/353169.html 今天我们来利用Android自定义控件实现一个比较有趣的效果:滑动水波纹.先来看看最终效果图: 图一 效果还是很炫的:饭要一口口吃,路要一步步走,这里我们将整个过程分成几步来实现 一.实现单击出现水波纹单圈效果: 图二 照例来说,还是一个自定义控件,这里我们直接让这个控件撑满整个屏幕(对自定义控件不熟悉的可以参看我之前的一篇文章:Android自定义控件系列二:自定义开关按钮(一)).观察这个效果,发现应该