android 刮刮乐的实现
来源:互联网 发布:知乎话题怎么添加 编辑:程序博客网 时间:2024/06/06 04:46
实现类似刮刮乐的功能(效果如图所示):
正如我们刮开彩票或者发票一样,会刮开上面一层灰色材质,底下中奖或者谢谢惠顾就会浮现。这样,刮刮乐其实是两层:上层灰色材质,底层中奖信息。在Android中分层很简单,只需要两个一样大小的View在相同的位置重叠就好了。一般可以使用相对布局:上层是我们自定义的EraseView,下层是一个写有中奖信息的TextView。我们需要将我们自定义的EraseView覆盖在TextView上,所以在layout文件中需要定义在TextView之后:
<RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="30dp" android:layout_marginTop="100dp"> <TextView android:id="@+id/textView1" android:layout_width="300dp" android:layout_height="150dp" android:textSize="40dp" android:gravity="center_vertical|center_horizontal" android:text="谢谢惠顾" android:background="@android:color/holo_red_dark" /> <com.example.guale.EraseView android:id="@+id/eraseView1" android:layout_width="300dp" android:layout_height="150dp"/> </RelativeLayout>下层实现很简单,主要是上层EraseView的实现,用户在滑动屏幕的时候,可以"刮开"该图层。我们知道每个View都有一个onDraw函数,当View绘制时,就会调用该函数:该函数就是利用一个Canvas(画布)绘制View。在众多自定义的View里都是主要利用该函数实现自己绚丽的特效。我们知道Canvas可以实现众多类型:点,线,图形,图片,文字等。上层灰色图层就是通过在画布上绘制灰色的bitmap实现的。如果直接在该bitmap使用上画,只能实现类似写字板的功能,可以在bitmap上留下痕迹,但是不能有“刮开”的效果。一种实现方案:
1、生成一个“透明”图像的画布
2、在画布上绘制灰色图像
3、接收用户触屏事件,记录触屏路径Path
4、将Path更新到“透明”图像上,该图像不停的记录我们触屏的路径,这些路径就会把灰色图像”清掉“,然后底层的“谢谢惠顾”就能显现。
5、将该“透明”图像绘制出来,显示当前灰色图像的“清理”情况。
public EraseView(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onDraw(Canvas canvas) { if (mCanvas == null) { EraseBitmp(); } canvas.drawBitmap(bitmap, 0, 0, null);mCanvas.drawPath(path,paint);super.onDraw(canvas);}public void EraseBitmp() {bitmap = Bitmap.createBitmap(getWidth(),getHeight(), Bitmap.Config.ARGB_4444);frontBitmap = CreateBitmap(Color.GRAY,getWidth(),getHeight());paint = new Paint();paint.setStyle(Paint.Style.STROKE);paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));paint.setAntiAlias(true);paint.setDither(true);paint.setStrokeJoin(Paint.Join.ROUND);paint.setStrokeCap(Paint.Cap.ROUND);paint.setStrokeWidth(20);path = new Path();mCanvas = new Canvas(bitmap);mCanvas.drawBitmap(frontBitmap, 0, 0,null);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubfloat ax = event.getX();float ay = event.getY();if (event.getAction() == MotionEvent.ACTION_DOWN) {isMove = false;path.reset();path.moveTo(ax, ay);invalidate();return true;} else if (event.getAction() == MotionEvent.ACTION_MOVE) {isMove = true;path.lineTo(ax,ay);invalidate();return true;}return super.onTouchEvent(event);}public Bitmap CreateBitmap(int color,int width, int height) {int[] rgb = new int [width * height];for (int i=0;i<rgb.length;i++) {rgb[i] = color;}return Bitmap.createBitmap(rgb, width, height,Config.ARGB_8888);}Demo例程:http://download.csdn.net/detail/xzwszl/6662255
- android 刮刮乐的实现
- Android 实现简单的刮刮乐
- Android LsitView的实现
- android 监听的实现
- android mms的实现
- android 权限的实现
- Android放大镜的实现
- android菜单的实现
- Android放大镜的实现
- Android放大镜的实现
- android tab的实现
- android 通讯录的实现
- android图表的实现
- Android闹钟的实现!
- android 传感器的实现
- Android闹钟的实现!
- android 手电筒的实现
- Android SlidingMenu 的实现
- linux上安装svn 提示svn: Unrecognized URL scheme错误
- C#广播程序
- POJ2457(广搜)
- C++动态联编-函数指针
- MFC 单文档的全局变量
- android 刮刮乐的实现
- 30天自制操作系统-第六天
- 【eLog/VSM】如何释放被占用端口
- UVA 10806 - Dijkstra, Dijkstra.(费用流)
- 使用jquery获取radio的值
- SharePoint 2010 文档管理系列
- Ubuntu12.04TLS 上iNode的安装
- Unix书籍
- 2.2-3 & 2.2-4