背景:需要实线一个类似刮刮乐的擦一擦效果,要求是在图片上覆盖半透明蒙层,蒙层支持手势擦除(类似橡皮擦)。

思路:使用自定义View在onDraw时进行绘制,绘制模式选择混合模式(叠加变透明)。

示例:

代码:

package com.xiazy.test;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;/*** @version V1.0* @Author Xiazy* @Date 2022/9/10 23:59:59* @Description: 自定义擦一擦类型动画效果-类似刮刮乐*/
public class WipeView extends View {// 擦一擦画笔private Paint paint;// 源图像-背景色private Bitmap decodeResourceSRC;// 目标图像-手指擦除的位置private Bitmap createBitmapDST;// 手指路径,使用贝塞尔路线private Path path;// 按下的坐标Xprivate float perX;// 按下的坐标Yprivate float perY;public WipeView(Context context, AttributeSet attrs) {super(context, attrs);}/*** 设置可擦除范围的擦一擦参数** @param width    宽度* @param height   高度* @param callBack 擦一擦事件回调*/public void setWipeData(int width, int height) {setWipeData(width, height, 0xC8000000, 45);}/*** 设置可擦除范围的擦一擦参数** @param width       宽度* @param height      高度* @param bgColor     默认背景颜色* @param strokeWidth 手指滑动的擦除线的宽度*/private void setWipeData(int width, int height, int bgColor, int strokeWidth) {// java.lang.IllegalArgumentException: width and height must be > 0if (width <= 0 || height <= 0) {return;}// 设置禁用硬件设置setLayerType(View.LAYER_TYPE_SOFTWARE, null);// 设置手指画笔paint = new Paint();paint.setAntiAlias(true);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(strokeWidth);// 生成图像手指源目标// 源--灰色背景区域decodeResourceSRC = Bitmap.createBitmap(width, height, Config.ARGB_8888);decodeResourceSRC.eraseColor(bgColor);// 目标--每次绘制的区域createBitmapDST = Bitmap.createBitmap(width, height, Config.ARGB_8888);// 手指滑动的路径path = new Path();}/*** 绘制擦一擦的擦除效果*/@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (paint == null || path == null || createBitmapDST == null) {return;}// 分层绘制int saveLayer = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);// 把手指轨迹画到目标图层上Canvas canvas2 = new Canvas(createBitmapDST);canvas2.drawPath(path, paint);// 把目标图像画到画布上canvas.drawBitmap(createBitmapDST, 0, 0, paint);// 设置混合模式(当目标图层不透明时,计算结果将是透明的),绘制源图像区域paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));canvas.drawBitmap(decodeResourceSRC, 0, 0, paint);// 清空混合模式paint.setXfermode(null);canvas.restoreToCount(saveLayer);}// 使用贝塞尔曲线,使折线过度圆滑@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {// 记录手指触摸的初始化位置case MotionEvent.ACTION_DOWN:if (path != null) {path.moveTo(event.getX(), event.getY());perX = event.getX();perY = event.getY();}break;// 记录手指移动的位置case MotionEvent.ACTION_MOVE:if (path != null) {float endX = (perX + event.getX()) / 2;float endY = (perY + event.getY()) / 2;path.quadTo(perX, perY, endX, endY);perX = event.getX();perY = event.getY();// 刷新视图postInvalidate();}break;//手指抬起case MotionEvent.ACTION_UP:break;default:break;}return true;}
}

【自定义控件】Android仿刮刮乐|刮刮卡|橡皮擦效果相关推荐

  1. Android仿拼多多实现图片叠加部分覆盖效果

    Android仿拼多多实现图片叠加部分覆盖效果 需要实现的效果如下: 代码部分: AppIconStackView: public class AppIconStackView extends Vie ...

  2. android浮窗播放器,Android仿优酷视频的悬浮窗播放效果

    之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能在悬浮窗中新建视频控件,所以需要在悬浮 ...

  3. android 仿搜索动画,Android仿京东顶部搜索框滑动伸缩动画效果

    最近使用京东发现,京东顶部的搜索框有一个新的伸缩效果,根据用户的手势滑动,伸缩搜索框.觉得效果还不错,就看了下其他的应用有没有这种伸缩的效果,发现安居客也使用了类似的一种效果,然后就想着实现这样的一种 ...

  4. boss直聘Android找工作界面,Android仿Boss直聘我的界面滑动效果

    最近在找工作,我在使用boss投简历的时候,看到boss的我的界面蛮有意思的,就想如何去实现它,可能是职业病吧,所以就打算仿一下.先看下仿的效果. image 其实我们拿到这个效果的时候,看到滑动,折 ...

  5. android 仿快递步骤_Android开发-类似物流快递进度效果

    释放双眼,带上耳机,听听看~! 老规矩先看图: 前言 写这篇之前,也考虑了好几种方案.网上有采用自定义控件的,有引用三方依赖的.但是考虑到后期更改样式问题,还是自己写吧.后期还可以补全动画效果,简单粗 ...

  6. Android仿微信聊天语言点击喇叭动画效果

    微信聊天界面点击语音时,喇叭的动画效果,下面上代码,该类是控制背景变化的工具类,不涉及语音录制和播放. 图片资源: package xxx;import android.os.Handler; imp ...

  7. android 仿美团悬浮,类似美团悬浮框的效果

    具体代码: ublic class MainActivity extends Activity implements OnScrollListener{ /** * 自定义的MyScrollView ...

  8. Android 仿美团网,大众点评购买框悬浮效果之修改版

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...

  9. android仿百度外卖波浪_Android实现波浪球效果

    波浪球的效果一直都是想模仿的对象,在最近一段时间里模仿了这一界面,其实所用知识并不多. 1).波浪的效果是利用三角函数来实现的,在自定义view中创建容量为width的数组,由y=Asin(Kx+T) ...

最新文章

  1. LeetCode简单题之逐步求和得到正数的最小值
  2. 把握机缘_机缘巧合,蒙太奇训练以及我的朋友如何使自己失业
  3. C# Email邮件发送,功能是密码找回或者重置功能。
  4. Linux内核--网络协议栈深入分析(一)--与sk_buff有关的几个重要的数据结构
  5. getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
  6. SQL Select语句完整的执行顺序:
  7. icoding复习7, 8
  8. 关于数据仓库的架构及3大类组件工具选型
  9. java 任务_Java-定时任务
  10. F9-sersync推送数据rsync拉取数据
  11. 创建私服maven服务
  12. 查询子串_你知道什么是 MySQL 的模糊查询?
  13. springboot优点_Spring boot入门
  14. [Luogu P2522] [HAOI2011]Problem b (莫比乌斯反演)
  15. 变分模态分解(VMD)运算步骤及源码解读
  16. Markdown 语法大全 包括设置字体 颜色
  17. 计算机WIN7安装,教您win7旗舰版安装教程
  18. 【CV】计算机视觉领域的 GAN 模型综述论文笔记
  19. 惨兮兮解决mysql安装坑
  20. linux下文件夹归置方式

热门文章

  1. php js 插件,超轻量级网页流布局JS插件Macy.js
  2. 使用vue-cli创建项目
  3. 多链跨链、高可用、高安全性的区块链应用如何落地? 金链盟大赛10强揭晓
  4. 计算机 拔电源 重启,电脑在关机就自动重新启动。但拔掉电源插头再关就又不会重新启动了。求高手帮忙!!!...
  5. SEM计算机价格计算,百度竞价SEMWHY:排名机制、价格计算公式是什么?
  6. 2022全新微信公众号无限回调授权系统源码
  7. 前端实现炫酷动效_Lottie-前端实现AE动效
  8. 突破asa,cer,cdx,php,aspx 上传
  9. 不用sqrt()函数,如何求平方根
  10. 计算机网络中传输速率最快的,计算机网络中常用的传输介质中传输速率最快的是什么...