今天整理之前的代码,忽然看到之前自己写的一个刮刮卡,整理下以便以后使用,同时分享给需要的朋友,如有错误,还请多多指正。
实现的步骤,其实就是徒手画三个图层叠加在一起,最上层是绘制需要的问题,就是以上所述的“骚年,刮我吧”,第二层就是覆盖宽高的灰层,第三层是结果层,多的不啰嗦了,具体实现如下,附上详细注释。
/** * * created by zero on 2016-9-9 * * 刮刮卡 * */ public class ScratchView extends View { public ScratchView(Context context) { super(context); init(); } private Canvas mCanvas = null; private Path mPath = null; private Paint mPaint = null; // 定义画布的宽和高 private int screenWidth = 720; private int screenHeight = 360; private Bitmap bitmap = null; private void init() { // TODO Auto-generated method stub mPath = new Path(); bitmap = Bitmap.createBitmap(screenWidth, screenHeight, Config.ARGB_8888); // 对mPaint的设置 mPaint = new Paint(); mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); mPaint.setAntiAlias(true); mCanvas = new Canvas(); mPaint.setDither(true); // 设置画笔为空心 mPaint.setStyle(Style.STROKE); // 设置线宽,即每次擦除的宽度 mPaint.setStrokeWidth(10); mPaint.setStrokeCap(Cap.ROUND); mPaint.setStrokeJoin(Join.ROUND); // 设置图形重叠时的处理方式,一共有16种方式,有兴趣可自己查阅 mPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); mPaint.setAlpha(0); mCanvas = new Canvas(bitmap); mCanvas.drawColor(Color.parseColor("#c0c0c0")); setBitmapText(); } private void setBitmapText() { Paint paint = new Paint(); paint.setTextSize(40); paint.setColor(Color.parseColor("#9f9fa0")); paint.setFlags(Paint.ANTI_ALIAS_FLAG); paint.setAntiAlias(true); paint.setTextAlign(Paint.Align.CENTER); paint.setFakeBoldText(true); Canvas canvas = new Canvas(bitmap); canvas.drawColor(Color.alpha(0)); canvas.rotate(-20); // 遍历绘制文字 for (int i = 0; i < screenWidth + 200; i += 300) { for (int j = 0; j < screenHeight + 200; j += 60) { canvas.drawText("刮我吧,骚年!", i, j, paint); } } setScratchBackground("一等奖"); } // 接收后台传来的文字,即中奖或者未中奖的文字 public void setScratchBackground(String txt_win) { // TODO Auto-generated method stub Paint paint = new Paint(); Bitmap bitmap = Bitmap.createBitmap(screenWidth, screenHeight, Config.ARGB_8888); paint.setTextSize(40); paint.setColor(Color.BLACK); paint.setFlags(Paint.ANTI_ALIAS_FLAG); paint.setAntiAlias(true); paint.setTextAlign(Paint.Align.CENTER); Canvas canvas = new Canvas(bitmap); canvas.drawColor(Color.alpha(0)); canvas.drawText(txt_win, screenWidth / 2, 60, paint); setBackgroundDrawable(new BitmapDrawable(getResources(), bitmap)); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); mCanvas.drawPath(mPath, mPaint); canvas.drawBitmap(bitmap, 0, 0, null); } int x = 0; int y = 0; @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub int action = event.getAction(); int currX = (int) event.getX(); int currY = (int) event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: { mPath.reset(); x = currX; y = currY; mPath.moveTo(x, y); } break; case MotionEvent.ACTION_MOVE: { mPath.quadTo(x, y, currX, currY); x = currX; y = currY; postInvalidate(); } break; case MotionEvent.ACTION_UP: { new Thread(mRunnable).start(); } case MotionEvent.ACTION_CANCEL: { mPath.reset(); } break; } return true; } private Runnable mRunnable = new Runnable() { private int[] mPixels; @Override public void run() { float wipeArea = 0; float totalArea = screenWidth * screenHeight; Bitmap mBitmap = bitmap; mPixels = new int[screenWidth * screenHeight]; /** * 拿到所有的像素信息 */ mBitmap.getPixels(mPixels, 0, screenWidth, 0, 0, screenWidth, screenHeight); /** * 遍历统计擦除的区域 */ for (int i = 0; i < screenWidth; i++) { for (int j = 0; j < screenHeight; j++) { int index = i + j * screenWidth; if (mPixels[index] == 0) { wipeArea++; } } } /** * 根据所占百分比,进行一些操作 */ if (wipeArea > 0 && totalArea > 0) { int percent = (int) (wipeArea * 100 / totalArea); /** * 设置达到多少百分比的时候,弹窗提醒是否中奖此处设置为20 */ if (percent > 20) { /** * 刮开奖以后的操作,此处在子线程toast,可能会发生线程阻塞,只为测试使用 */ Looper.prepare(); Toast.makeText(getContext(), "已刮开" + percent + "%", Toast.LENGTH_LONG).show(); Looper.loop(); } } } }; }
发的是公司需要的效果,以上代码只是一个实现,各种样式还需要自己去实现。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Android刮刮卡效果实现代码,包括了Android刮刮卡效果实现代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android刮刮卡效果,供大家参考,具体内容如下 android实现底层一张图片,上层一个遮罩层,触摸滑动按手指滑动路径实现去除遮罩效果,类似于抽奖的刮刮卡一样,不多说先上张效果图: 直接上代码: XfermodeView.java Xfermod
本文向大家介绍Android刮刮卡实现原理与代码讲解,包括了Android刮刮卡实现原理与代码讲解的使用技巧和注意事项,需要的朋友参考一下 实现刮刮卡我们可以Get到哪些技能? * 圆形圆角图片的实现原理 * 双缓冲技术绘图 * Bitmap获取像素值数据 * 获取绘制文本的长宽 * 自定义View的掌握 * 获取屏幕密度 * TypeValue.applyDemension * Canvas的一
本文向大家介绍简单实现Android刮刮卡效果,包括了简单实现Android刮刮卡效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android仿刮刮卡效果展示的具体代码,供大家参考,具体内容如下 一、Xfermode 通过使用Xfermode将绘制的图形的像素和Canvas上对应位置的像素按照一定的规则进行混合,形成新的像素,再更新到Canvas中形成最终的图形,使用的时候都是
本文向大家介绍Android开发之自定义刮刮卡实现代码,包括了Android开发之自定义刮刮卡实现代码的使用技巧和注意事项,需要的朋友参考一下 关于刮刮卡的实现效果不需要做太多解释,特别是在电商APP中,每当做活动的时候都会有它的身影存在,趁着美好周末,来实现下这个效果,也算是对零碎知识点的一个整合。 所涉及的知识点: 1、自定义View的一些流程 2、双缓冲绘图机制 3、Paint的绘图模式
本文向大家介绍2种jQuery 实现刮刮卡效果,包括了2种jQuery 实现刮刮卡效果的使用技巧和注意事项,需要的朋友参考一下 其中拖拽刮涂层效果使用jquery UI的draggable方法 以下是源代码: 这里给大家分享的是十分常用的刮奖的特效代码,希望小伙伴们能够喜欢。
本文向大家介绍20行JS代码实现网页刮刮乐效果,包括了20行JS代码实现网页刮刮乐效果的使用技巧和注意事项,需要的朋友参考一下 分享一段用canvas和JS制作刮刮乐的代码,JS部分去掉注释不到20行代码 效果如下 盖伦.jpg 刮刮乐.gif HTML部分 没什么要特别注意的 为了效果加了些CSS样式 CSS部分 注意 1.为了清除浏览器自带效果加了 2.img需要在灰布下面,加了z-index