Android 自定义View之咖啡杯动画

利用Photoshop通道工具快速抠出半透明效果的烟雾,烟雾抠图教程实例。

许多的人不知道弥雾机和烟雾机的区别,有的人就会想,弥雾机和烟雾机不都是打药的一种机械吗、其实不然,弥雾机和烟雾机这两者之间还是有不同之处的。下面就让小编给大家分析下弥雾机和烟雾机的不同之处吧!

图片 1CoffeeView图片 2CoffeeView

最终效果

烟雾机是在很早以前,从国外引进来的一种高科技技术,烟雾机的的特点就是添加专用烟雾剂喷洒烟雾,带动药物喷洒,烟雾机在空间喷出的烟雾浓度高,在空间弥漫效果比较好,烟雾机喷出的药物颗粒细,熏杀效果好,喷洒时效果很壮观很震撼,这烟雾机只适合适用于大面积森林杀虫,卫生防疫,不适用于食用农作物,烟雾机接触杀菌效果差。

大概思路

图片 3

弥雾机基本上是国内研发的,是在烟雾机的基础上研究出来的,弥雾机是结合了国内的实际情况研制的。他具备了烟雾机的一切特点,在烟雾机原有的基础上加大了功率,弥雾机能够在农作物上直接喷洒水和药物的混合液,药物颗粒细,弥雾机喷出的药物比较均匀,药物杀菌效果好,弥雾机喷洒出来的能力比较强,弥雾机适应于果园,大棚蔬菜,是农民朋友的好帮手。

  • 自定义view,直接继承view
  • 复写onSizeChanged()方法,在此计算杯垫,杯子,烟雾效果的path
  • 在onDraw()方法中,描绘杯垫,杯子
  • 处理烟雾动画效果

原图

这里需要画两部分内容,第一部分是杯子,第二部分是杯耳

图片 4

我们可以使用addRoundRect来描绘圆角矩形,并且可指定每个圆角的半径即圆角的程度

/** * Add a closed round-rectangle contour to the path. Each corner receives * two radius values [X, Y]. The corners are ordered top-left, top-right, * bottom-right, bottom-left * * @param rect The bounds of a round-rectangle to add to the path * @param radii Array of 8 values, 4 pairs of [X,Y] radii * @param dir The direction to wind the round-rectangle's contour */public void addRoundRect(RectF rect, float[] radii, Direction dir) { if (rect == null) { throw new NullPointerException("need rect parameter"); } addRoundRect(rect.left, rect.top, rect.right, rect.bottom, radii, dir);}

以下代码注释:

//计算view的中心点坐标mCenterX = w / 2;mCenterY = h / 2;//杯子的宽,为view的宽度的2/3float cupWidth = w * 2 / 3f;//杯子的高,为view的高度3/8float cupHeight =  * 3 / 4f;//计算出杯子的中心点坐标float cupCenterX = mCenterX;float cupCenterY = mCenterY + cupHeight / 2;//计算杯子矩形的左上右上的圆角半径float cupTopRoundRadius = Math.min(cupWidth, cupHeight) / 20f;//计算杯子矩形的左下右下的圆角半径float cupBottomRoundRadius = cupTopRoundRadius * 10;//重置杯子pathmCupPath.reset();//添加杯子轨迹mCupPath.addRoundRect(new RectF(cupCenterX - cupWidth / 2, cupCenterY - cupHeight / 2 - cupHeight / 10, cupCenterX + cupWidth / 2, cupCenterY + cupHeight / 2), new float[]{cupTopRoundRadius, cupTopRoundRadius, cupTopRoundRadius, cupTopRoundRadius, cupBottomRoundRadius, cupBottomRoundRadius, cupBottomRoundRadius, cupBottomRoundRadius}, Path.Direction.CW);//计算杯耳宽度float cupEarWidth = (w - cupWidth) * 3 / 4f;//计算杯耳高度float cupEarHeight = cupHeight / 3;//计算杯耳的中心点坐标float cupEarCenterX = mCenterX + cupWidth / 2;float cupEarCenterY = mCenterY + cupHeight / 2;//计算杯耳的圆角半径float cupEarRoundRadius = Math.min(cupEarWidth, cupEarHeight) / 2f;//设置杯耳画笔的描边宽度mCupEarPaint.setStrokeWidth(Math.min(cupEarWidth, cupEarHeight) / 3f);//重置杯耳pathmCupEarPath.reset();//添加杯耳轨迹mCupEarPath.addRoundRect(new RectF(cupEarCenterX - cupEarWidth / 2, cupEarCenterY - cupEarHeight / 2 - cupHeight / 10, cupEarCenterX + cupEarWidth / 2, cupEarCenterY + cupEarHeight / 2), new float[]{cupEarRoundRadius, cupEarRoundRadius, cupEarRoundRadius, cupEarRoundRadius, cupEarRoundRadius, cupEarRoundRadius, cupEarRoundRadius, cupEarRoundRadius}, Path.Direction.CW);

在onDraw方法中

发表评论

电子邮件地址不会被公开。 必填项已用*标注