刮刮卡android代码,简单实现Android刮刮卡效果

2023-10-11 15:30

本文主要是介绍刮刮卡android代码,简单实现Android刮刮卡效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文实例为大家分享了Android仿刮刮卡效果展示的具体代码,供大家参考,具体内容如下

一、Xfermode

通过使用Xfermode将绘制的图形的像素和Canvas上对应位置的像素按照一定的规则进行混合,形成新的像素,再更新到Canvas中形成最终的图形,使用的时候都是通过Paint.setXfermode来实现。

二、混合模式分类

PorterDuff则是用于描述数字图像合成的基本手法,通过组合使用Porter-Duff操作,可完成任意2D图像的合成。

public class PorterDuff {

// these value must match their native equivalents. See SkPorterDuff.h

public enum Mode {

/** [0, 0] */

CLEAR (0),

/** [Sa, Sc] */

SRC (1),

/** [Da, Dc] */

DST (2),

/** [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc] */

SRC_OVER (3),

/** [Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc] */

DST_OVER (4),

/** [Sa * Da, Sc * Da] */

SRC_IN (5),

/** [Sa * Da, Sa * Dc] */

DST_IN (6),

/** [Sa * (1 - Da), Sc * (1 - Da)] */

SRC_OUT (7),

/** [Da * (1 - Sa), Dc * (1 - Sa)] */

DST_OUT (8),

/** [Da, Sc * Da + (1 - Sa) * Dc] */

SRC_ATOP (9),

/** [Sa, Sa * Dc + Sc * (1 - Da)] */

DST_ATOP (10),

/** [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] */

XOR (11),

/** [Sa + Da - Sa*Da,

Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)] */

DARKEN (12),

/** [Sa + Da - Sa*Da,

Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)] */

LIGHTEN (13),

/** [Sa * Da, Sc * Dc] */

MULTIPLY (14),

/** [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] */

SCREEN (15),

/** Saturate(S + D) */

ADD (16),

OVERLAY (17);

Mode(int nativeInt) {

this.nativeInt = nativeInt;

}

/**

* @hide

*/

public final int nativeInt;

}

1、SRC类,优先显示的是源图片。SRC_IN处理图片相交区域时,受到目标图片的Alpha值影响,当我们的目标图片为空白像素的时候,源图片也会变成空白,简单的来说就是用目标图片的透明度来改变源图片的透明度和饱和度,当目标图片的透明度为0时,源图片就不会显示。SRC_OUT用我们目标图片的透明度的补值来改变源图片的透明度和饱和度,当目标图片的透明度为不透明时,源图片就不会显示。SRC_ATOP当透明度为100%和0%时,SRC_IN和SRC_ATOP是通用的,当透明度不为上述的两个值时,SRC_ATOP比SRC_IN源图像的饱和度会增加,变得更亮一些。

2、DST类,优先显示的是目标图片。DST_IN在相交的时候以源图片的透明度来改变目标图片的透明度和饱和度,当源图片的透明度为0的时候,目标图片完全不显示。

3、其它的叠加效果,MULTIPLY可以把图片的轮廓取出来,LIGHTEN变亮效果。

三、刮刮卡效果

1、效果图

258f307178228bfd0ec6ebaa6d91feab.gif

2、实现思路

利用PorterDuffXfermode中的模式SRC_OUT,先绘制最终呈现的图片并将图层保存起来,然后将手指移动的轨迹渲染到画布上,并绘制目标图片到画布上,最后用目标图片的透明度的补值来改变源图片的透明值,将最终呈现的图片显示在屏幕上。

3、代码实例

public class GuaCardView extends View {

private Bitmap mSrcText;

private Bitmap mSrcBitmap;

private Bitmap mDstBitmap;

private Paint mPaint;

private Path mPath;

private float mStartX,mStartY;

public GuaCardView(Context context, AttributeSet attrs) {

super(context, attrs);

setLayerType(LAYER_TYPE_SOFTWARE,null);

mPaint = new Paint();

mPaint.setColor(Color.RED);

mPaint.setStyle(Paint.Style.STROKE);

mPaint.setStrokeWidth(45);

mSrcText = BitmapFactory.decodeResource(getResources(), R.drawable.guaguaka_text1);

mSrcBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.guaguaka);

mDstBitmap = Bitmap.createBitmap(mSrcBitmap.getWidth(),mSrcBitmap.getHeight(), Bitmap.Config.ARGB_8888);

mPath = new Path();

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

//画最终呈现的图

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

int layerId = canvas.saveLayer(0,0,getWidth(),getHeight(),null,Canvas.ALL_SAVE_FLAG);

//把手指轨迹画到画布上

Canvas c = new Canvas(mDstBitmap);

c.drawPath(mPath,mPaint);

//利用SRC_OUT绘制原图

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

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));

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

mPaint.setXfermode(null);

canvas.restoreToCount(layerId);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

switch(event.getAction()){

case MotionEvent.ACTION_DOWN:

mPath.moveTo(event.getX(),event.getY());

mStartX = event.getX();

mStartY = event.getY();

return true;

case MotionEvent.ACTION_MOVE:

float endX = (mStartX+event.getX())/2;

float endY = (mStartY+event.getY())/2;

mPath.quadTo(mStartX,mStartY,endX,endY);

mStartX = event.getX();

mStartY = event.getY();

break;

default:

break;

}

postInvalidate();

return super.onTouchEvent(event);

}

}

上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

这篇关于刮刮卡android代码,简单实现Android刮刮卡效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/189030

相关文章

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三