Android:简单实现美女扒衣服小游戏

实现思路

说说实现的大概思路,首先要有两副图片。这两幅图片的区别就在于一副有穿衣服,另外一副没有穿衣服,其他的细节都要一模一样。这对于懂ps的童鞋就好办啦自己动手制作就好了。但是本文为了照顾不懂ps的童鞋,提供两幅图片供大家使用~~图中美女不美各位不要吐槽哈~。

A图:没穿衣服(after1)

B图:有衣服的(pre1)

首先一开始是把A图放在屏幕上,然后再把B图覆盖在A图上。那样用户一开始看到的是B图。我们通过,监听手指移动到哪些座标上,就设置这些座标的颜色为透明色。那么用户看到的就是A图,也就达到了扒衣服的效果。


大概思路简单叙述完了,那么接下来看看详细代码:


具体实现

首先在xml布局文件写上两个ImageView


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".MainActivity">

    <ImageView
        android:src="@drawable/after1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ImageView
        android:id="@+id/iv2
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>
由于我们只需操作B图的像素点的颜色是否透明,所以只给第二个ImageView 定义id,第一个ImageView则不定义id

然后我们看java代码:
首先获取B图的bitmap对象:
       bitmap= BitmapFactory.decodeResource(getResources(), R.drawable.pre1);

在对B图进行处理之前我们先得出B图的副本copyBitmap:
1.创建空白bitmap
copyBitmap=Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
2.实例化Canvas对象,并把copyBitmap传进去
   Canvas canvas=new Canvas(copyBitmap);
3.new一支画笔出来,并设置默认颜色:
        Paint paint=new Paint();
        paint.setColor(Color.BLACK);

4.最后照着B图“画”出来
 canvas.drawBitmap(bitmap, new Matrix(), paint);
就这样copyBitmap就与B图的实例bitmap一模一样了,也就是说已经创建出B图的的副本啦。

最后把copyBitmap显示在表层的ImageView(也就是布局文件中的第二个ImageView)上
 iv2.setImageBitmap(bitmap);

现在运行会看到是这个样子的:




显示图片的步骤就是以上四步,那么接下来我们来实现监听用户手指滑动,并在所滑过的座标设置为透明。

        iv2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_MOVE:
                        int x = (int) event.getX();
                        int y = (int) event.getY();
                                    copyBitmap.setPixel(x, y , Color.TRANSPARENT);
                        iv2.setImageBitmap(copyBitmap);
                        Log.i("test", x + "," + y);
                        break;
                }

                return true;
            }
        });

copyBitmap.setPixel(x, y , Color.TRANSPARENT);代码就是将座标为想x,y的像素点设置为透明色,而event.getX()与event.getY()则是分别获取用户触摸控件上的x座标和y座标。请注意这里笔者说的是控件上的座标,并不是屏幕上的座标。关于屏幕座标与控件座标的区别可以看以下博文


写到这里,可以运行一下,可以发现是可以“扒掉衣服”但是未免扒得也太慢了吧。为了满足饥渴的大家,为了能够扒衣服扒得快一点可以加上几句代码,变成这样:

 case MotionEvent.ACTION_MOVE:
                        int x = (int) event.getX();
                        int y = (int) event.getY();
                        for (int i = -18; i < 20; i++) {
                            for (int j = -18; j < 20; j++) {
                                try {
                                    copyBitmap.setPixel(x + i, y + j, Color.TRANSPARENT);
                                } catch (Exception e) {
                                    // TODO: handle exception
                                }
                            }
                        }


                        iv2.setImageBitmap(copyBitmap);
                        Log.i("test", x + "," + y);
                        break;


聪明的读者一定可以发现,这几句代码的作用就是把目标像素点的周围的像素点也变成透明色,来达到我们手指的作用范围。

写到这里可以发现扒衣服的速度明显快很多。
恩~只有扒衣服未免单一了一点,我们还可以在扒衣服的过程中加点声音。
我们可以在手指滑动之后擡起的时候播放我们预先准备的声音,在手指触摸到屏幕的时候停止播放。

        iv2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_UP:

                            mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.higirl);


                        mediaPlayer.start();;
                        break;
                    case MotionEvent.ACTION_MOVE:
                        int x = (int) event.getX();
                        int y = (int) event.getY();
                        for (int i = -18; i < 20; i++) {
                            for (int j = -18; j < 20; j++) {
                                try {
                                    copyBitmap.setPixel(x + i, y + j, Color.TRANSPARENT);
                                } catch (Exception e) {
                                    // TODO: handle exception
                                }
                            }
                        }


                        iv2.setImageBitmap(copyBitmap);
                        Log.i("test", x + "," + y);
                        break;
                    case MotionEvent.ACTION_DOWN:
                        if(mediaPlayer!=null){
                            mediaPlayer.stop();

                            mediaPlayer.release();
                        }

                        break;

                }

                return true;
            }

声音文件笔者放到res\raw里面了。
在这里再运行一次:




最后要用到的图片和声音文件都在demo里面,有兴趣的可以下载一下。


DEMO下载





















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章