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

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

public class GuaView extends View { 

  private Bitmap mBitmap; //遮盖的图层
  private Canvas mCanvas; //绘制遮盖图层
  private Paint mOuterPaint;
  private Path mPath;
  private float mLastX;
  private float mLastY; 

  private Bitmap mCoverBitmap; //遮盖图
  private int mWidth, mHeight;
  private Paint mInnerPaint;
  private String mInfo; 

  public GuaView(Context context) {
    this(context, null);
  } 

  public GuaView(Context context, AttributeSet attrs) {
    super(context, attrs); 

    init();
  } 

  private void init() {
    mPath = new Path();
    mOuterPaint = new Paint();
    mInnerPaint = new Paint();
    mCoverBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.fg_guaguaka); 

    mInfo = "¥ 5 0 0";
  } 

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    mWidth = mCoverBitmap.getWidth();
    mHeight = mCoverBitmap.getHeight();
    setMeasuredDimension(mWidth, mHeight); 

    mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mBitmap);
    mCanvas.drawBitmap(mCoverBitmap, 0, 0, null); 

    setOuterPaint();
    setInnerPaint(); 

  } 

  private void setInnerPaint() {
    mInnerPaint.setColor(Color.RED);
    mInnerPaint.setStyle(Paint.Style.STROKE);
    mInnerPaint.setStrokeCap(Paint.Cap.ROUND);
    mInnerPaint.setStrokeJoin(Paint.Join.ROUND);
    mInnerPaint.setAntiAlias(true);
    mInnerPaint.setDither(true); //防抖
    mInnerPaint.setStrokeWidth(5);
    mInnerPaint.setTextSize(100);
    mInnerPaint.setTextAlign(Paint.Align.CENTER);
  } 

  private void setOuterPaint() {
    mOuterPaint.setColor(Color.GREEN);
    mOuterPaint.setStyle(Paint.Style.STROKE);
    mOuterPaint.setStrokeCap(Paint.Cap.ROUND);
    mOuterPaint.setStrokeJoin(Paint.Join.ROUND);
    mOuterPaint.setAntiAlias(true);
    mOuterPaint.setDither(true); //防抖
    mOuterPaint.setStrokeWidth(20);
  } 

  @Override //Path
  public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        mLastX = x;
        mLastY = y;
        mPath.moveTo(x, y);
        break;
      case MotionEvent.ACTION_MOVE:
        float deltaX = Math.abs(x - mLastX);
        float deltaY = Math.abs(y - mLastY);
        if (deltaX > 5 || deltaY > 5) {
          mPath.lineTo(x, y);
        }
        mLastX = x;
        mLastY = y;
        break;
      case MotionEvent.ACTION_UP:
        break;
    }
    invalidate();//调用onDraw
    return true;
  } 

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas); 

    canvas.drawColor(Color.parseColor("#bbbbbb")); //背景底色 灰色
    canvas.drawText(mInfo, mWidth / 2, mHeight / 4 * 3, mInnerPaint); //绘制文本
    canvas.drawBitmap(mBitmap, 0, 0, null); //绘制mBitmap  这是一个可变的bitmap,通过mCanvas绘制,首先绘制了mCoverBitmap
    drawPath(); 

  } 

  private void drawPath() {
    //使用该mode:dst和src相交后, 只保留dst,且除去相交的部份
    mOuterPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
    mCanvas.drawPath(mPath, mOuterPaint);
  }
} 

Paint.Join 连续画笔衔接时:

  •         MITER 在外边缘以一个锐角连接
  •         ROUND 以圆弧
  •         BEVEL 以直线

Paint.Cap 指定对于 线和路径(lines and paths) 的开始和结束点的处理方式:

  •         BUTT  ends with the path  不超越它
  •         ROUND  with the center at the end of the path 半圆
  •         SQUARE  with the center at the end of the path 方形

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, 抽奖
刮刮卡
微信刮刮卡抽奖、刮刮卡抽奖规则、网页刮刮卡抽奖、cf刮刮卡抽奖技巧、微信刮刮卡抽奖源码,以便于您获取更多的相关知识。

时间: 2024-11-03 16:46:05

Android App中实现简单的刮刮卡抽奖效果的实例详解_Android的相关文章

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

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

Android 两个Fragment之间的跳转和数据的传递实例详解

Android  两个Fragment之间的跳转和数据的传递实例详解 作为一个Android的菜鸟,前些天在做项目的时候用到了fragment,需求是从一个Fragment跳转到另一个Fragment,并且还要传递数据,就像Activity的跳转一样.在网上找了好久都没找到很好的列子,最后通过看别人的博客和查文档终于做好了,现在整理一下,希望能帮助有需要的童鞋. 1.首先在第一个Fragment 里面拿到FragmentManger 和FragmentTransaction 代码如下. @Ove

jQuery中通过ajax调用webservice传递数组参数的问题实例详解_jquery

下面通过实例给大家说明比较直观些,更方便大家了解. 本人的项目中通过jquery.ajax调用webservice. 客户端代码如下: $.ajax({ url: "test/xxx.asmx", type: 'POST', dataType: 'xml', timeout: , data: { name: "zhangsan", tags: ["aa", "bb", "cc"] }, error: fun

Android中标签容器控件的实例详解_Android

前言 在一些APP中我们可以看到一些存放标签的容器控件,和我们平时使用的一些布局方式有些不同,它们一般都可以自动适应屏幕的宽度进行布局,根据对自定义控件的一些理解,今天写一个简单的标签容器控件,给大家参考学习. 下面这个是我在手机上截取的一个实例,是在MIUI8系统上截取的 这个是我实现的效果图 原理介绍 根据对整个控件的效果分析,大致可以将控件分别从以下这几个角度进行分析: 1.首先涉及到自定义的ViewGroup,因为现有的控件没法满足我们的布局效果,就涉及到要重写onMeasure和onL

Android编程中context及全局变量实例详解_Android

本文实例讲述了Android编程中context及全局变量的用法.分享给大家供大家参考,具体如下: 今天在研究context的时候,对application和activity context有了一定的了解,下面是从网上复制过来的资料 Application context和Activity context的区别: 这是两种不同的context,也是最常见的两种.第一种中context的生命周期与Application的生命周期相关的,context随着Application的销毁而销毁,伴随ap

Android 实现夜间模式的快速简单方法实例详解_Android

ChangeMode 项目地址:ChangeMode Implementation of night mode for Android. 用最简单的方式实现夜间模式,支持ListView.RecyclerView. Preview Usage xml android:background="?attr/zzbackground" app:backgroundAttr="zzbackground"//如果当前页面要立即刷新,这里传入属性名称 比如 R.attr.zzb

Android APP数字解锁实例详解_Android

Android APP数字上锁 最近抽时间做了下数字解锁的功能,手机有数字解锁,App也可以做到,避免某些应用隐私泄漏,一下就是实现效果图: 序言:这两天老大给了个任务,说是做一个仿ios的数字锁屏界面,心想着这种东西网上应该有挺多的,然后就先百度了一把,谁知道案例好像少的可怜,然后带着怀疑的心态去下载了千辛万苦找到的"源码",看里面写的,然后自己有点眉目了,就自己借着"源码"的思路自己实现了一把,见上图. 思路: 这里我们可以看成两部分,一部分是上面的输入的,另一

Android 中SP与DP的区别实例详解_Android

从一开始写Android程序,就被告知这些常识 1.长度宽度的数值要使用dp作为单位放入dimens.xml文件中 2.字体大小的数值要使用sp作为单位,也放入dimens.xml文件中 然后,就没有然后了,仿佛潜台词就是说,你记住去用就行了. 偶然有一天,当我们阴差阳错地将字体写成了dp,也是可以工作,而且效果和sp一样. 这时候,就开始怀疑了,到底有啥区别呢,dp和sp有什么不同呢? 我们做个简单的Sample验证一下,如下,一个布局代码 <TextView android:layout_w

Android编程中的消息机制实例详解_Android

本文实例讲述了Android编程中的消息机制.分享给大家供大家参考,具体如下: 在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListener { private TextView stateText; private Button btn; @Override public void onCreate(Bundle savedInstanceState)