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

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

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

(0)

相关推荐

  • Android刮刮卡效果实现代码

    本文实例为大家分享了Android刮刮卡效果,供大家参考,具体内容如下 android实现底层一张图片,上层一个遮罩层,触摸滑动按手指滑动路径实现去除遮罩效果,类似于抽奖的刮刮卡一样,不多说先上张效果图: 直接上代码: XfermodeView.java /** * Created by 57 on 2016-4-21. */ public class XfermodeView extends View{ private Bitmap mBgBitmap,mFgBitmap; private P

  • 简单实现Android刮刮卡效果

    本文实例为大家分享了Android仿刮刮卡效果展示的具体代码,供大家参考,具体内容如下 一.Xfermode 通过使用Xfermode将绘制的图形的像素和Canvas上对应位置的像素按照一定的规则进行混合,形成新的像素,再更新到Canvas中形成最终的图形,使用的时候都是通过Paint.setXfermode来实现. 二.混合模式分类 PorterDuff则是用于描述数字图像合成的基本手法,通过组合使用Porter-Duff操作,可完成任意2D图像的合成. public class Porter

  • Android App中实现简单的刮刮卡抽奖效果的实例详解

    主要思想: 将一个view设计成多层:背景层,含中奖信息等: 遮盖层,用于刮奖,使用关联一个Bitmap的Canvas 在该Bitmap上,使用它的canvas.drawPath的api来处理 手势滑动(类似刮奖的动作) 使用paint.setXfermode 来进行消除手势滑动区域 public class GuaView extends View { private Bitmap mBitmap; //遮盖的图层 private Canvas mCanvas; //绘制遮盖图层 privat

  • Android刮刮卡实现原理与代码讲解

    实现刮刮卡我们可以Get到哪些技能? * 圆形圆角图片的实现原理 * 双缓冲技术绘图 * Bitmap获取像素值数据 * 获取绘制文本的长宽 * 自定义View的掌握 * 获取屏幕密度 * TypeValue.applyDemension * Canvas的一些绘制方法 * Paint的一些常用的属性 * Path的一些方法 刮刮卡的实现原理图 这里用到了13中模式中的DstOut这种模式. 对于这幅图而言,首先绘制Dst,设置xfermode,再绘制Src. 刮刮卡的实现原理步骤 1.绘制显示

  • Android开发之自定义刮刮卡实现代码

    关于刮刮卡的实现效果不需要做太多解释,特别是在电商APP中,每当做活动的时候都会有它的身影存在,趁着美好周末,来实现下这个效果,也算是对零碎知识点的一个整合. 所涉及的知识点: 1.自定义View的一些流程 2.双缓冲绘图机制 3.Paint的绘图模式 4.触摸事件的一些流程 5.Bitmap的相关知识 实现思路: 其实非常简单,首先我们需要确定所要绘图的区域,然后对这块区域进行多层的绘图(背景层,前景层),然后去监听触摸事件,把手指触摸的区域的前景层给消除即可. 首先我们先来实现一个简单版的

  • Android实现商城购物车功能的实例代码

    最近公司项目做商城模块,需要实现购物车功能,主要实现了单选.全选,金额合计,商品删除,商品数量加减等功能,先看看效果图: 在这里插入图片描述 一.实现步骤: 0.添加依赖库 1.购物车主界面布局文件(activity_main.xml) 2.购物车实现逻辑主界面(MainActivity.class) 3.使用ExpandableListView,继承BaseExpandableListAdapter 4.购物车数据的bean类(ShoppingCarDataBean.class) 5.分店铺实

  • Android滑动删除数据功能的实现代码

    今天学习了新的功能那就是滑动删除数据.先看一下效果 我想这个效果大家都很熟悉吧.是不是在qq上看见过这个效果.俗话说好记性不如赖笔头,为了我的以后,为了跟我一样自学的小伙伴们,我把我的代码粘贴在下面. activity_lookstaff.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.co

  • Android添加指纹解锁功能的实现代码

    前言 指纹解锁技术成为当前验证用户信息的重要手段,基本上当前手机都配置了指纹解锁.当开发的APP需要加密验证时可以考虑添加系统指纹解锁功能. 添加指纹解锁功能步骤很简单,大致过程如下: 1 添加权限 在Manifest.xml文件中添加访问用户指纹的权限. <uses-permission android:name="android.permission.USE_FINGERPRINT"/> 2 声明系统提供的指纹管理类对象 private FingerprintManag

  • Android 购物车加减功能的实现代码

    Android 实现购物车加减功能,效果图如下所示: public class adderView extends LinearLayout implements View.OnClickListener, TextWatcher { private int amount = 0; //购买数量 private int goods_storage = Integer.MAX_VALUE; //商品库存 private OnAmountChangeListener mListener; priva

  • Android实现强制下线功能的示例代码

    一.回顾 上次连载写了两个类,一个类ActivityCollector.java用于管理所有的活动:一个类是BaseActivity.java作为所有活动的父类: 还有一个放在layout目录中的登录界面login.xml 二.登录页面的活动 接下来写一个登录页面的活动,继承自BaseActivity.java package com.example.broadcastbestpractice; import android.content.Intent; import android.os.B

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

    今天整理之前的代码,忽然看到之前自己写的一个刮刮卡,整理下以便以后使用,同时分享给需要的朋友,如有错误,还请多多指正. 实现的步骤,其实就是徒手画三个图层叠加在一起,最上层是绘制需要的问题,就是以上所述的"骚年,刮我吧",第二层就是覆盖宽高的灰层,第三层是结果层,多的不啰嗦了,具体实现如下,附上详细注释. /** * * created by zero on 2016-9-9 * * 刮刮卡 * */ public class ScratchView extends View { pu

  • Android 百度地图定位实现仿钉钉签到打卡功能的完整代码

    导语 本章根据百度地图API,实现仿钉钉打卡功能.用到了基础地图.覆盖物.定位图层.陀螺仪方法.悬浮信息弹框. 百度地图API地址  :Android 地图SDK 请先注册注册百度账号和获取密钥,并实现地图显示出来.(注意:密钥.权限要设置) 另外,我得说明本章所下载官方Demo 和 导入的jar包和so文件.自定义下载即可,如下图: 接下来,一起看实现效果. 源码Git地址:BaiduMapApp 效果图 实现代码·三步骤 第一步:基础地图和方向传感器 类先实现方向传感器 implements

  • Android实现手绘功能

    本文实例为大家分享了Android实现手绘功能的具体代码,供大家参考,具体内容如下 布局文件如下 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-au

  • Android 获取随机验证码功能示例

    验证码功能在各大网站都能用到,下面小编通过实例代码给大家分享Android 获取随机验证码功能,具体代码如下所示: package cn.hk.image; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; impo

  • Android实现手势密码功能

    本文实例为大家分享了Android实现手势密码功能的具体代码,供大家参考,具体内容如下 首先声明一下,九宫格布局是从网上扒了一个大神写好的,大家在项目中实现的话可以直接把: Drawl,GuestureLockView,Point类直接复制到自己的项目中: 想了解功能的可以仔细看下源码中的这三个类,里面写的也非常详细: 使用GuestureLockView的三个步: 1.初始化布局容器: 2.初始化GuestureLockView; 3.将GuestureLockView添加到布局容器中: 创建

随机推荐