使用Canvas对象实现“刮刮乐”效果

在淘宝、京东等电商举办活动的时候,经常可以看到在移动客户端推出的各种刮奖活动,而这种活动也受到了很多人的喜爱。从客户端的体验来说,这种效果应该是通过网页来实现的,那么,我们使用Android的自带控件能不能实现这种刮刮乐的效果呢?当然可以,本篇文章将介绍使用Canvas这个对象,如何实现“刮刮乐”的效果。

先看效果图

下面我们看一下如何使用代码实现

布局文件

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/after"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/a" />

    <ImageView
        android:id="@+id/before"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/b" />

</FrameLayout>

Activity代码

public class MainActivity extends Activity implements OnTouchListener {

	private ImageView imgafter;
	private ImageView imgbefore;
	private Canvas canvas;
	private Paint paint;
	private Bitmap bitmap;
	private Bitmap before;
	private Bitmap after;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		imgafter = (ImageView) findViewById(R.id.after);
		imgbefore = (ImageView) findViewById(R.id.before);

		// 获得图片
		after = BitmapFactory.decodeResource(getResources(), R.drawable.a);
		before = BitmapFactory.decodeResource(getResources(), R.drawable.b);

		imgafter.setImageBitmap(after);
		imgbefore.setImageBitmap(before);
		// 创建可以修改的空白的bitmap
		bitmap = Bitmap.createBitmap(before.getWidth(), before.getHeight(),
				before.getConfig());
		imgbefore.setOnTouchListener(this);
		paint = new Paint();
		paint.setStrokeWidth(5);
		paint.setColor(Color.BLACK);
		// 创建画布
		canvas = new Canvas(bitmap);
		canvas.drawBitmap(before, new Matrix(), paint);
	}

	@Override
	public boolean onTouch(View arg0, MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_MOVE:
			int newX = (int) event.getX();
			int newY = (int) event.getY();
			// 将滑过的地方变为透明
			for (int i = -10; i < 10; i++) {
				for (int j = -10; j < 10; j++) {
					if ((i + newX) >= before.getWidth()
							|| j + newY >= before.getHeight() || i + newX < 0
							|| j + newY < 0) {
						return false;
					}
					bitmap.setPixel(i + newX, j + newY, Color.TRANSPARENT);
				}
			}
			imgbefore.setImageBitmap(bitmap);
			break;
		}
		return true;
	}
}

可以看到,代码很简单,几十行代码就实现了简单的“刮刮乐”的效果。

原理是这样的,一开始两张图片重叠,显示的还没有刮开的效果。

在Activity的onTouch方法中,我们对滑动事件进行监听,当用户用手指滑动屏幕的时候,我们将滑过的画布部分的颜色设置为透明,同时,把改变之后的bitmap对象设置为ImageView的背景,这样,隐藏在后面的图片就显示出来了,也就实现了刮刮乐的效果。

使用Canvas对象实现“刮刮乐”效果,布布扣,bubuko.com

时间: 2024-10-06 23:34:17

使用Canvas对象实现“刮刮乐”效果的相关文章

刮刮乐实现效果

当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画布的属性,比如,画布的颜色.尺寸等.下面来分析Android中Canvas有哪些功能,Canvas提供了如下一些方法: Canvas(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布. Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,则将内

HTML5 CSS3 专题 :canvas 实现彩票刮刮乐

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/34089553 今天给大家带来一个刮刮乐的小例子~基于HTML5 canvas的,有兴趣的可以改成android版本的,或者其他的~ 效果图: 贴一张我中500w的照片,咋办啊,怎么花呢~ 好了,下面开始原理: 1.刮奖区域两个Canvas,一个是front , 一个back ,front遮盖住下面的canvas. 2.canvas默认填充了一个矩形,将下面canvas效果图遮盖

[cocos2d-js]cc.RenderTexture几种用法(数字图片、刮刮乐效果)

[转]http://blog.csdn.net/realcrazysun1/article/details/42393629 本文基于cocos2d-js 3.0版本引擎开发 RenderTexture用法1:数字图片 通过这张图片实现任意数字 //数字图片精灵 var PictureNumber = cc.Sprite.extend({ m_Number:null, m_NumberTexture:null, ctor:function(){ this._super(); }, buildNu

HTML5 简单实现刮刮乐效果

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"

Android实现刮刮乐效果

前几个月刚接触Android的时候做了一个小项目,其中也用到了类似刮刮乐的效果,现在把代码贴出来 首先要做一个类似橡皮擦的东西吧,然后才能把纸上的笔迹擦除 /** * FileName: SplashActivity.java * * @desc 橡皮擦功能,类似刮刮乐效果 * @author HTP * @Date 20140311 * @version 1.00 */ public class Text_Rubbler extends TextView { private float TOU

H5 Canvas刮刮乐

玩游戏的人 很多时候都会遇到翻牌子  开宝箱. 总有人傻傻的在哪里还纠结很久到底点哪一个! 纠结  指不定翻哪一个会多一点,你明明看到那个卡片的奖项多 . 那我就告诉你好了  其实很多时候在你点开那个页面的时候你的翻牌结果已经随着你点开而请求到了. 接下来 就是一些动画效果 然后告诉你的中奖结果是什么. 其实就很像你看的那种街头,赌碗 一个样子. 为什么 你的大号 总是什么奖都抽不到  小号总是能够抽到一些东西. 其实就是游戏策划对用户的一些粘度数据的分析   还有就是对你用户的衰减做的一些统计

游戏的套路你知道吗? H5 Canvas刮刮乐

玩游戏的人 很多时候都会遇到翻牌子  开宝箱. 总有人傻傻的在哪里还纠结很久到底点哪一个! 纠结  指不定翻哪一个会多一点,你明明看到那个卡片的奖项多 . 那我就告诉你好了  其实很多时候在你点开那个页面的时候你的翻牌结果已经随着你点开而请求到了. 接下来 就是一些动画效果 然后告诉你的中奖结果是什么. 其实就很像你看的那种街头,赌碗 一个样子. 为什么 你的大号 总是什么奖都抽不到  小号总是能够抽到一些东西. 其实就是游戏策划对用户的一些粘度数据的分析   还有就是对你用户的衰减做的一些统计

canvas 实现刮刮乐

在解决问题前,我们先来了解一下 canvas 标签canvas 是 html5 出现的新标签,像所有的 dom 对象一样它有自己本身的属性.方法和事件,其中就有绘图的方法,js 能够调用它来进行绘图. context是一个封装了很多绘图功能的对象,获取这个对象的方法是 : var canvas = document.querySelector('canvas');var ctx = canvas.getContext("2d");123canvas元素绘制图像的时候有两种方法,分别是:

实现刮刮乐的效果

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> * { margin: 0; padding: 0; } </style> </head> <body> <div id="box">