android 倒水动画,Android 模拟圆形水杯倒水的效果
先看下效果,离我的想达到的效果还比较远
主要是原理是不断改变贝塞尔曲线的控制点(改变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 模拟圆形水杯倒水的效果相关推荐
- android 海浪动画,android自定义波浪加载动画的实现代码
本文实例为大家分享了android自定义波浪加载动画的具体代码,供大家参考,具体内容如下 效果图 1.自定义控件 WaveView package com.example.wh.myapplicati ...
- android jason动画,Android 动画之Lottie动画使用
Android 动画之Lottie动画使用 一:简介 Lottie是Airbnb开源的一套跨平台的完整解决方案,设计师只需要使用After Effects(简称AE)设计动画之后,使用Lottic提供 ...
- android弹球动画,Android动画之自定义Evaluator实现弹球效果
前言 今天给大家带来的是自定义Evaluator实现弹球效果,我们先给大家来个效果图. 下面我们介绍具体代码流程 1. 自定义Point类 public class Point { private i ...
- android decorview动画,Android窗口机制(二)Window,PhoneWindow,DecorView,setContentView源码理解...
Android窗口机制系列 前篇文章中出现了PhoneWindow,DecorView这些类,如果是第一次见过的话,肯定会觉得陌生.这篇文章主要跟大家讲解Window,PhoneWindow,Deco ...
- android 减速动画,Android View Animation
概述 可译为视图动画,分为 缩放动画 平移动画 渐变动画 旋转动画 Android系统中定义了一个抽象类Animation来定义这种视图动画,它的具体子类如下表: 动画名称 对应的子类 xml中标签 ...
- android 底部动画,Android实现360手机助手底部的动画菜单
首先来看下我们实现的效果和360效果的对比: 360手机助手效果演示 本库实现的效果(Icon来自360手机助手,侵删) xml布局文件 注:为了美观,讲每个Button的高度以及固定,设置wrap_ ...
- android 4 动画,[Android]开发App,你得知道这些4——动画
0.前言 上一篇文章中,我们讲解了Android的触摸事件 有兴趣的可以去看一看 准备工作 在读本文前,你最好有以下准备: (1)安装Android Stuido(以下简称AS) (2)有一定的Jav ...
- android 逐字动画,Android实现文本逐字显示View(类似rpg游戏人物对话,文本逐字显示)...
前面好多篇文章都是Android Studio.源码编译.ndk等相关教程,今天敲一敲代码,不然都生锈了哈_. 来个古装动画美图,缓解大家疲劳的眼睛...(话说有木有人知道这是谁???) Paste_ ...
- android 科技动画,android开发ViewFlipper触摸动画
[IT168技术]介绍:在教程中,我们可以学习如何解决在Android项目的共同问题,有更多的关于Android的项目信息,我建议你下载ADT Android Pluglins和Eclipse. 背景 ...
- android 飞机动画,Android实现纸飞机的简单操作
在项目中,我们要求做一个纸飞机的功能:就是当打开这个界面时,会有4架纸飞机从屏幕左侧飞入,然后到达自己的位置坐上下浮动,同时云彩也不断地从屏幕右侧飘到屏幕左侧.当你点击其中一个纸飞机时,这个纸飞机先向 ...
最新文章
- 终于,「最近邻搜索」有通用方法了
- 探索 | 神经网络到底是如何思考的?MIT精英们做了这么一个实验室来搞清楚
- SQL查询所有客人的第一次用餐时间
- Java:Java编程实现导出二维码
- Android 对okhttp的封装
- python实现requests访问接口,比如es接口
- Cannot set property 'value' of undefined
- 界址点圆圈怎么生成_大千世界怎么钓鱼?大千世界钓鱼方法及灵气之水获取攻略...
- fanuc机器人自动程序前怎么回原点_FANUC机器人的执行程序
- 附录 SpringBoot 默认的扫描包是哪个?
- js实现前端根据部对象属性对对象数组进行排序
- Knockout v3.4.0 中文版教程-6-计算监控-可写的计算监控
- Jetson tk1 刷机教程
- QComboBox下拉框
- STM32 HAL库BH1750光强检测器驱动代码
- 20145324 《信息安全系统设计基础》第七周学习总结
- 全球“最能打”的8位功夫明星:中国有3人,没成龙也没甄子丹
- [计算机动画]Games103-作业1-刚体动画
- 防WiFi万能钥匙蹭网,隐藏ssid就可以了
- 基于tair的分布式锁实现原理
热门文章
- jqwidgets 国际化- 中文 jqxGrid 中文语言包 gridlocalization
- android 输入法判断,Android如何检测输入法键盘是否显示
- 高校云平台V3.1版总结
- Vue实现简单的音乐播放器
- js判断background颜色明暗色调,以设置白/黑字体颜色
- 循序渐进学Docker pdf
- elasticsearch+logstash+kibana+filebeat+kafka
- 删除磁盘分区 删除OEM分区
- 计算机网络应用基础心得体会,计算机网络技术学习心得体会
- Redis主从复制-Replication