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
原创粉丝点击