首页 > 系统 > Android > 正文

Android刮刮卡功能具体实现代码

2019-12-12 05:16:53
字体:
来源:转载
供稿:网友

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

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

/** *  * 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();        }      }    }  };}

发的是公司需要的效果,以上代码只是一个实现,各种样式还需要自己去实现。

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表