文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-06-06 07:32

关注

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

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



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);
        
        if (percent > 20)
        {
          
          Looper.prepare();
          Toast.makeText(getContext(), "已刮开" + percent + "%",
              Toast.LENGTH_LONG).show();
          Looper.loop();
        }
      }
    }
  };
}

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

您可能感兴趣的文章:简单实现Android刮刮卡效果Android刮刮卡效果实现代码Android刮刮卡实现原理与代码讲解Android App中实现简单的刮刮卡抽奖效果的实例详解Android开发之自定义刮刮卡实现代码


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯