Android 模拟圆形水杯倒水的效果
来源:互联网 发布:大尺度网络电影 编辑:程序博客网 时间:2024/04/27 16:51
先看下效果,离我的想达到的效果还比较远
主要是原理是不断改变贝塞尔曲线的控制点(改变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<distHeight){//现在的高度大于目标高度 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; }}
0 0
- Android 模拟圆形水杯倒水的效果
- 算法题:水杯倒水的问题
- 水杯倒水问题
- 水杯倒水问题 bfs
- nyoj21 三个水杯倒水
- 三个水杯倒水的问题 还是没写出来
- android圆形图片效果
- android 模拟下雪的效果
- Android高级UI ProgressBar实现各种效果的圆形进度
- Android 自定义View实现圆形切图的效果
- Pots (模拟倒水)
- poj3414 pots 倒水模拟
- 带蒙版效果的圆形图标
- 3个水杯倒水问题(广度优先搜索)
- 广度优先搜索——水杯倒水问题
- android 模拟真书翻页效果的博客
- android:模拟水波效果的自定义View
- Android 模拟电视机开关机的动画效果
- Javascrpt无刷新文件上传
- poj3009
- Base64
- arguments实参集合与局部变量,参数关系
- Ubuntu Linux中开启MySQL远程访问功能
- Android 模拟圆形水杯倒水的效果
- poj3669
- 将Rsyslog的日志输出到Kafka消息队列
- BZOJ 1452 [JSOI2009]Count 二维树状数组
- poj3126
- Android开发使用LogCat,LogCat常见问题
- linux的3个查找命令
- 于庆玲2014134029
- uva 10163 - Storage Keeperst