首頁  >  文章  >  Java  >  Android App中實現簡單的刮刮卡抽獎效果的實例詳解

Android App中實現簡單的刮刮卡抽獎效果的實例詳解

高洛峰
高洛峰原創
2017-01-17 10:21:311871瀏覽

主要思想:
將一個view設計成多層:背景層,含中獎資訊等;
遮蓋層,用於刮獎,使用關聯一個Bitmap的Canvas
在該Bitmap上,使用它的canvas.drawPath的api來處理手勢滑動(類似刮獎的動作)
使用paint.setXfermode 來進行消除手勢滑動區域

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

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 連續畫筆銜接時:  ROUND 以圓弧

        BEVEL 以直線

Paint.Cap 指定對於線和路徑(lines and paths) 的開始和結束點的處理方式:

    ROUND  with the center at the end of the path 半圓

        SQUARE  with the center at the end of the path 方形

更多Android App中實現簡單的刮刮卡抽獎效果的實例詳解相關文章請關注中文PHP網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn