制作水波加载动画

本来想写写有点意思的东西的,哈哈,上篇文章说的,以后再写吧。今天先介绍一下一个水波加载动画,效果图如下:

做的比较简单,真机效果比这个好很多,这个截图做的gif,有点蛋疼。

说说思路吧:

1. 首先画正弦曲线,这里取的是正弦周期的前3/4个周期,这样看起来比其他的周期变化很好点;

2. 画了正弦曲线以后,就要让正弦曲线动起来,怎么动起来?乍一看觉得很困难的样子,其实我们想想移动正弦曲线,不过是某个位置的Y轴值变化了,那么我们只要给sin(x)中添加一个变量就行,即sin(x + offset),offset的值按时间规律来变化,那么最后表现出来的效果就有移动的感觉。

3. 关于正弦曲线振幅不能设置的太高,因为我们的屏幕本来就很小,如果振幅很大就表现的很不真实,我这里取的是30,看起来效果还不错。

4. 最后就是y轴方向的改变了。要不停的提升,这里写死了,如果想用,就直接写个方法,去设置就行,比如你要设置百分比之类的。

最后上代码:

package com.zdl.wavedemo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by zhoudailiang on 2015/7/14.
 */
public class WaveView extends View {

    private Paint paint;
    private Path mPath;
    private float offset = 0.0f; // 控制正弦曲线的变化
    private MyThread thread;
    private final float amplidute = 30; // 振幅
    private float gradualY; // Y方向的渐变量
    private float gradualX; // X方向的渐变量
    private boolean isMoving = true; // 可以移动

    public WaveView(Context context) {
        super(context);
        init();
    }

    public WaveView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        // 初始化画笔
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(2);

        // 初始化变量
        gradualX = 0.02f;

        // 初始化路径
        mPath = new Path();

        // 初始化线程
        thread = new MyThread();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        gradualY = getMeasuredHeight();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int width = getMeasuredWidth();
        int height = getMeasuredHeight();

        mPath.reset();
        for (float i = 0; i < width; i += 0.5) {
            float tmp = (float) (1.5 * Math.PI * i / width);
            float y = amplidute * (float)Math.sin(tmp + offset) + gradualY;
            if (i == 0) {
                mPath.moveTo(0f, y);
            } else {
                mPath.lineTo(i, y);
            }
        }
        mPath.lineTo(width, height);
        mPath.lineTo(0, height);
        mPath.close();
        canvas.drawPath(mPath, paint);
        // 启动线程开始更新
        if (!thread.isAlive() && isMoving) {
            thread.start();
        }
    }

    class MyThread extends Thread {
        public void run() {
            while (isMoving) {
                offset =  offset + gradualX > 2 * Math.PI ? 0 : offset + gradualX;
                gradualY -= 0.5;
                if (gradualY < -amplidute) {
                    isMoving = false;
                    break;
                }
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                postInvalidate();
            }
        }
    }
}

代码如上,很简单。其实这里还可以通过另一种方式实现,下篇文章进行介绍。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 02:17:11

制作水波加载动画的相关文章

纯CSS+HTML制作网页加载动画

我们都知道网页的加载需要一定的时间, 即使我们在努力优化代码执行效率以及压缩文件, 但是还是需要时间啊,  在这段时间内如果表面上不发生任何事情, 用户就会有比较糟糕的体验, 但是如果有一个动画或者一个进度条, 那就完全不一样了, 这篇文章分享纯CSS+HTML加载动画代码 HTML代码如下 <div id="start-screen"> <div class="in-start"> <div class="first&quo

css3动画特效:纯css3制作win8加载动画特效

Windows 8 css特效代码: <style type="text/css"> .hnyei{margin: 0 auto; width:600px; height:400px; background-color: #90da15; } .wrapp{position: absolute; top: 25%; left: 50%; width: 600px; height: 300px; margin: -150px 0 0 -300px; -webkit-persp

CSS3绘制8种超炫的加载动画

CSS3绘制8种超炫的加载动画     逛前端开发网站的时候,偶尔发现一组非常炫酷的CSS3加载动画,遂迫不及待的做个Demo保存下来. 这些加载动画用到了CSS3的旋转transform属性,颜色透明度设置和伪元素操作等CSS技术.奇妙的组合,产生了意想不到的效果. 1.上下起伏波动的加载动画: #loader1, #loader1:before, #loader1:after { background: #f2fa08; -webkit-animation: load1 1s infinit

CSS 实现加载动画之五-光盘旋转

原文:CSS 实现加载动画之五-光盘旋转 今天做的这个动画叫光盘旋转,名字自己取的.动画的效果估计很多人都很熟悉,就是微信朋友圈里的加载动画.做过前面几个动画,发现其实都一个原理,就是如何将动画的元素如何分离出来.这个动画的实现也很简单,关键点在于如何将元素拼凑成风车形状.然后定义动画的关键帧为rotate 360度,应用于整个元素上,就可以使整个元素旋转起来.案例在请在chrome中查看. 1. 先看截图 2. 代码实现思路 2.1 首先还是定义四个元素,元素的中心为这四个元素组成的圆的圆心.

CSS 实现加载动画之四-圆点旋转

原文:CSS 实现加载动画之四-圆点旋转 圆点旋转也是加载动画中经常用到的.其实现方式和菊花旋转一样,只不过一个是线条形式,一个是圆点形式.圆点按照固定的旋转角度排列,加上延时的改变透明度的动画就可以实现.这个实现也比较简单. 1. 动画截图 2. 案例源代码 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" Content="text/html

CSS 实现加载动画之三-钢琴按键

原文:CSS 实现加载动画之三-钢琴按键 今天做的这个动画实现也是非常简单,简单数几行代码就可以搞定.给这个动画取了个优雅的名字--钢琴按键,也实在是想不出什么更形象的名字了.废话不多说,直接上图. 1. 先看gif图 2. 代码实现思路 2.1 定义五个方块的元素. 2.2 对方块元素使用动画,延时改变透明度. 3. 主要使用的技术 主要用到了animation动画 @-webkit-keyframes load{ 0%{opacity:1;} 100%{opacity:0;}}.m-load

几行css3代码实现超炫加载动画

之前为大家分享了css3实现的加载动画.今天为大家带来一款只需几行代码就可以实现超炫的动画加载特效.我们一起看下效果图: 在线预览   源码下载 实现代码: 极简的html代码: <div> <i></i> </div> css3代码: body { background: black; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; heig

使用Animate.css和wow.js,实现各大网站常用的页面加载动画

经常见到某个网站的动画是在屏幕显示到This元素的时候,会有个过渡动画. 主要区别于在普通页面是在页面加载完成后所有动画一起动,或者设置延迟时间. 而这两个插件混搭使用可以是页面现在到该元素时才加载动画.拥有非常不错的效果. 算个比较常见的交互效果,研究了一下午,主要使用以下两个插件完成. 1.wow.js 实现了在网页滚动时的动画效果,有漂亮的动画效果,依赖于Animate.css. 2.Animate.css 非常优秀的CSS3动画库,不依赖于jQuery,纯CSS动画 用法: <link

超酷jQuery进度条加载动画集合

在丰富多彩的网页世界中,进度条加载动画的形式非常多样,有利用gif图片实现的loading动画,也有利用jQuery和CSS3实现的进度加载动画,本文主要向大家介绍很多jQuery和CSS3实现的进度条加载动画,每一个都非常具有创意.如果你喜欢,可以下载源码并将它们应用到自己的网站中去. HTML5 Canvas发光Loading动画 它是一个Loading加载动画,并不能实现具体进度的加载,但是可以提示用户数据或者页面正在加载.并且该应用利用Canvas绘制动画,效果非常不错. DEMO演示