先看下效果,离我的想达到的效果还比较远

主要是原理是不断改变贝塞尔曲线的控制点(改变path即可)

效果为从百分之0到百分70然后改变颜色,水最终停留在 百分之20,百分比计算不准确的,只是大概而已

下面是源码,但是没有完善

package com.example.myapp;

import android.content.Context;

import android.graphics.*;

import android.util.AttributeSet;

import android.util.Log;

import android.view.View;

import android.widget.ImageView;

import java.lang.ref.WeakReference;

/**

* Created by jiangwj on 2015/3/18.

*/

public class WaveView extends ImageView {

private Paint mPaint;

private Xfermode mXfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);

private float waveY;//起始点以及重点的y

private float ctrolX,ctrolY;//控制点的y

private float mWidth,mHeight;

private Path mPath;// 路径对象

private boolean isAdd;//水平增加

private boolean isUp;//向上增加

private Bitmap markBitmap;

private boolean isAni=true;

private int distHeight;//目标高度

private float percent;//百分比

public WaveView(Context context, AttributeSet attrs) {

super(context, attrs);

mPaint = new Paint(Paint.ANTI_ALIAS_FLAG| Paint.DITHER_FLAG);

mPaint.setColor(0xcce1162e);

// 不使用硬件加速

setLayerType(LAYER_TYPE_SOFTWARE, null);

//mPaint.setMaskFilter(new EmbossMaskFilter(new float[] { 1, 1, 1F }, 0.1F, 0.1F, 10F));

mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID));

mPath = new Path();

mXfermode=new PorterDuffXfermode(PorterDuff.Mode.DST_IN);

}

public void addAnimotion(){

percent= (float) (1-ctrolY/mHeight);

if(percent>=0.7f) {

mPaint.setColor(0xcc11ff24);

setDist(20);

}

if (ctrolX >= mWidth + 1 / 4F * mWidth) {

isAdd = false;

}else if (ctrolX <= -1 / 4F * mWidth) {

isAdd = true;

}

ctrolX = isAdd ? ctrolX + mWidth/10: ctrolX - mWidth/10;

changeHeight();

postInvalidate();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

{

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

/**

* 如果类型是圆形,则强制改变view的宽高一致

*/

int width = Math.min(getMeasuredWidth(), getMeasuredHeight());

setMeasuredDimension(width, width);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

mWidth = w;

mHeight = h;

//控制点的Y,其实为高度为0

ctrolY = mHeight;

//起点终点的Y

waveY = ctrolY+mHeight/10;

setDist(70);

}

public void setPath(){

mPath.moveTo(-1 / 4F * mWidth, waveY);//起点

mPath.quadTo(ctrolX, ctrolY, mWidth + 1 / 4F * mWidth, waveY);//二阶贝塞尔曲线

mPath.lineTo(mWidth + 1 / 4F * mWidth, mHeight);

mPath.lineTo(-1 / 4F * mWidth, mHeight);

mPath.close();

}

@Override

protected void onDraw(Canvas canvas) {

if(markBitmap==null){

markBitmap=getMarkBitmap();

}

setPath();//生成图案路径

//图层

int sc = canvas.saveLayer(0, 0, mWidth, mHeight, null, Canvas.ALL_SAVE_FLAG);

canvas.drawPath(mPath, mPaint);//水波

mPaint.setXfermode(mXfermode);

canvas.drawBitmap(markBitmap,0,0,mPaint);

mPaint.setXfermode(null);

canvas.restoreToCount(sc);

mPath.reset();//重置图案路径

if(isAni){//是否开启动画

addAnimotion();

}

}

//设置当前百分比

public void setDist(int percent){

distHeight= (int) (mHeight*(100-percent)/100);

}

public void changeHeight(){

if(ctrolY

ctrolY +=1;

waveY += 1;

}

if(ctrolY>=distHeight){

ctrolY -=1;

waveY -= 1;

}

}

//覆盖层的圆形

public Bitmap getMarkBitmap()

{

Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(),

Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG| Paint.DITHER_FLAG);

paint.setColor(Color.BLACK);

// paint.setMaskFilter(new BlurMaskFilter(5, BlurMaskFilter.Blur.SOLID));

canvas.drawCircle(mWidth/2, mWidth/ 2, mWidth / 2, paint);

return bitmap;

}

}

android 倒水动画,Android 模拟圆形水杯倒水的效果相关推荐

  1. android 海浪动画,android自定义波浪加载动画的实现代码

    本文实例为大家分享了android自定义波浪加载动画的具体代码,供大家参考,具体内容如下 效果图 1.自定义控件 WaveView package com.example.wh.myapplicati ...

  2. android jason动画,Android 动画之Lottie动画使用

    Android 动画之Lottie动画使用 一:简介 Lottie是Airbnb开源的一套跨平台的完整解决方案,设计师只需要使用After Effects(简称AE)设计动画之后,使用Lottic提供 ...

  3. android弹球动画,Android动画之自定义Evaluator实现弹球效果

    前言 今天给大家带来的是自定义Evaluator实现弹球效果,我们先给大家来个效果图. 下面我们介绍具体代码流程 1. 自定义Point类 public class Point { private i ...

  4. android decorview动画,Android窗口机制(二)Window,PhoneWindow,DecorView,setContentView源码理解...

    Android窗口机制系列 前篇文章中出现了PhoneWindow,DecorView这些类,如果是第一次见过的话,肯定会觉得陌生.这篇文章主要跟大家讲解Window,PhoneWindow,Deco ...

  5. android 减速动画,Android View Animation

    概述 可译为视图动画,分为 缩放动画 平移动画 渐变动画 旋转动画 Android系统中定义了一个抽象类Animation来定义这种视图动画,它的具体子类如下表: 动画名称 对应的子类 xml中标签 ...

  6. android 底部动画,Android实现360手机助手底部的动画菜单

    首先来看下我们实现的效果和360效果的对比: 360手机助手效果演示 本库实现的效果(Icon来自360手机助手,侵删) xml布局文件 注:为了美观,讲每个Button的高度以及固定,设置wrap_ ...

  7. android 4 动画,[Android]开发App,你得知道这些4——动画

    0.前言 上一篇文章中,我们讲解了Android的触摸事件 有兴趣的可以去看一看 准备工作 在读本文前,你最好有以下准备: (1)安装Android Stuido(以下简称AS) (2)有一定的Jav ...

  8. android 逐字动画,Android实现文本逐字显示View(类似rpg游戏人物对话,文本逐字显示)...

    前面好多篇文章都是Android Studio.源码编译.ndk等相关教程,今天敲一敲代码,不然都生锈了哈_. 来个古装动画美图,缓解大家疲劳的眼睛...(话说有木有人知道这是谁???) Paste_ ...

  9. android 科技动画,android开发ViewFlipper触摸动画

    [IT168技术]介绍:在教程中,我们可以学习如何解决在Android项目的共同问题,有更多的关于Android的项目信息,我建议你下载ADT Android Pluglins和Eclipse. 背景 ...

  10. android 飞机动画,Android实现纸飞机的简单操作

    在项目中,我们要求做一个纸飞机的功能:就是当打开这个界面时,会有4架纸飞机从屏幕左侧飞入,然后到达自己的位置坐上下浮动,同时云彩也不断地从屏幕右侧飘到屏幕左侧.当你点击其中一个纸飞机时,这个纸飞机先向 ...

最新文章

  1. 终于,「最近邻搜索」有通用方法了
  2. 探索 | 神经网络到底是如何思考的?MIT精英们做了这么一个实验室来搞清楚
  3. SQL查询所有客人的第一次用餐时间
  4. Java:Java编程实现导出二维码
  5. Android 对okhttp的封装
  6. python实现requests访问接口,比如es接口
  7. Cannot set property 'value' of undefined
  8. 界址点圆圈怎么生成_大千世界怎么钓鱼?大千世界钓鱼方法及灵气之水获取攻略...
  9. fanuc机器人自动程序前怎么回原点_FANUC机器人的执行程序
  10. 附录 SpringBoot 默认的扫描包是哪个?
  11. js实现前端根据部对象属性对对象数组进行排序
  12. Knockout v3.4.0 中文版教程-6-计算监控-可写的计算监控
  13. Jetson tk1 刷机教程
  14. QComboBox下拉框
  15. STM32 HAL库BH1750光强检测器驱动代码
  16. 20145324 《信息安全系统设计基础》第七周学习总结
  17. 全球“最能打”的8位功夫明星:中国有3人,没成龙也没甄子丹
  18. [计算机动画]Games103-作业1-刚体动画
  19. 防WiFi万能钥匙蹭网,隐藏ssid就可以了
  20. 基于tair的分布式锁实现原理

热门文章

  1. jqwidgets 国际化- 中文 jqxGrid 中文语言包 gridlocalization
  2. android 输入法判断,Android如何检测输入法键盘是否显示
  3. 高校云平台V3.1版总结
  4. Vue实现简单的音乐播放器
  5. js判断background颜色明暗色调,以设置白/黑字体颜色
  6. 循序渐进学Docker pdf
  7. elasticsearch+logstash+kibana+filebeat+kafka
  8. 删除磁盘分区 删除OEM分区
  9. 计算机网络应用基础心得体会,计算机网络技术学习心得体会
  10. Redis主从复制-Replication