这篇文章主要介绍了 Android 刮刮卡功能具体实现代码, 具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
今天整理之前的代码,忽然看到之前自己写的一个刮刮卡,整理下以便以后使用,同时分享给需要的朋友,如有错误,还请多多指正。
实现的步骤,其实就是徒手画三个图层叠加在一起,最上层是绘制需要的问题,就是以上所述的 "骚年,刮我吧",第二层就是覆盖宽高的灰层,第三层是结果层,多的不啰嗦了,具体实现如下,附上详细注释。
- /**
- *
- * 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();
- }
- }
- }
- };
- }
发的是公司需要的效果,以上代码只是一个实现,各种样式还需要自己去实现。
来源: http://www.phperz.com/article/17/0319/295225.html