首页 > 其他分享 >Andriod实现刮刮卡的效果

Andriod实现刮刮卡的效果

时间:2022-12-05 15:34:10浏览次数:42  
标签:mInnerPaint 效果 private Bitmap Paint 刮刮卡 Andriod import android


思想:

将一个View设计成多层,内层(包括中奖信息)和外层(用于刮奖),外层的图层用Canvas与一个Bitmap关联,用这个关联的Bitmap来处理手势的滑动,类似于刮奖的动作。

使用paint.setXfermode 来进行消除手势滑动区域

package com.jackie.guaguale;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
* Created by Administrator on 2015/7/29.
*/
public class GuaView extends View {
private Path mPath;
private Paint mInnerPaint; //内层图层Paint
private Paint mOuterPaint; //外层图层Paint
private Bitmap mGuaBitmap; //用于处理刮奖的Bitmap
private Bitmap mOuterBitmap; //外层图层Bitmap
private Canvas mCanvas;

private int mWidth, mHeight;

private float mLastX;
private float mLastY;

private String mText;

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

private void init() {
mPath = new Path();
mOuterPaint = new Paint();
mInnerPaint = new Paint();

//创建外层图层
mOuterBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.guaguaka).copy(Bitmap.Config.ARGB_8888, true);
mText = "¥500";
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mWidth = mOuterBitmap.getWidth();
mHeight = mOuterBitmap.getHeight();

//创建内层图层
mGuaBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mGuaBitmap);
mCanvas.drawBitmap(mOuterBitmap, 0, 0, null); //将mOuterBitmap画到mCanvas上,与mGuaBitmap关联

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

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

canvas.drawColor(Color.parseColor("#bbbbbb")); //背景底色 灰色
canvas.drawText(mText, mWidth / 2, mHeight / 4 * 3, mInnerPaint); //绘制文本
canvas.drawBitmap(mGuaBitmap, 0, 0, null); //绘制外层Bitmap, 将mBitmap显示在界面上
drawPath();
}

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


效果图如下:

Andriod实现刮刮卡的效果_刮奖


标签:mInnerPaint,效果,private,Bitmap,Paint,刮刮卡,Andriod,import,android
From: https://blog.51cto.com/u_11407799/5912439

相关文章

  • Android实现水波纹外扩效果
    微信曾经推出了一个查找附近好友的功能,大致功能是这样的:屏幕上有一个按钮,长按按钮的时候,会有一圈圈水波纹的动画向外扩散,松手后,动画结束。现在简单来实现这样的一个动画功能......
  • css3动画效果一览
     <divhs-animate-in-class="animate__animated${下面的动画库}"></div>         ......
  • 验证darknet中前处理做图像缩放(双线性内插值法)scale的算法效果
    ​​DARKNET中使用的缩放算法是双线性内插值法,这里就实际验证一把DARKNET中scale的工作原理与效果:首先这是一张原图,画面中的是南京明城墙玄武门,玄武湖的正门。18年国庆带娃......
  • css 滤镜效果
    如何让网站变灰在这些变灰的网站中我们总能在根元素上根选择器::roothtmlelement.style中找到一个与滤镜相关的css属性filter:greyscale(1)这添加的是一层滤镜效......
  • leaflet 河流颜色渐变效果
    1、Leaflet-polycolor  github地址:https://github.com/Oliv/leaflet-polycolor 插件缺陷:需要把每个折点的颜色都指定才行,一般做不到2、Leaflet.hotline github......
  • CSS实现3D旋转相册效果
    效果预览前置知识透视,perspective3D位移,translate3d(x,y,z)3D旋转,rotate3d(x,y,z)3D呈现,transform-styleCSS3动画,@keyframesbox-reflect、linear-gra......
  • 几行代码实现页面置灰效果
    constd=document.createElement('style');d.setAttribute('type','text/css');d.innerHTML=`html{filter:grayscale(100%);-webk......
  • WPF 文本逐字一个个出现的动画效果
    一、效果图:  二、前台代码:<Grid><TextBlockForeground="Transparent"x:Name="text"TextWrapping="Wrap">刚刚想半天都不知道取个什......
  • 21个令人惊叹的HTML5效果
    ​​http://net.tutsplus.com/articles/web-roundups/21-ridiculously-impressive-html5-canvas-experiments/​​​1http://www.effectgames.com/d......
  • echart之饼图 3D效果
    html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"co......