Welcome

首页 / 移动开发 / Android / Android刮刮卡功能具体实现代码

今天整理之前的代码,忽然看到之前自己写的一个刮刮卡,整理下以便以后使用,同时分享给需要的朋友,如有错误,还请多多指正。



实现的步骤,其实就是徒手画三个图层叠加在一起,最上层是绘制需要的问题,就是以上所述的“骚年,刮我吧”,第二层就是覆盖宽高的灰层,第三层是结果层,多的不啰嗦了,具体实现如下,附上详细注释。

/** ** 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 stubmPath = 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 stubPaint 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));}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);mCanvas.drawPath(mPath, mPaint);canvas.drawBitmap(bitmap, 0, 0, null);}int x = 0;int y = 0;@SuppressLint("ClickableViewAccessibility")@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubint 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;@Overridepublic 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();}}}};}
发的是公司需要的效果,以上代码只是一个实现,各种样式还需要自己去实现。

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