读书人

android小运用帮美女更衣系列二(附源

发布时间: 2012-09-27 11:11:17 作者: rapoo

android小应用帮美女更衣系列二(附源码)
点击ImageSwitcher显示的图片即可切换到为美女换衣全屏界面,手指在界面上滑动,滑动处的衣服就被褪掉了,很黄很暴力,大家要hold住呀!!
其实啊这个实现就是两张图片,一张底图,一张上面的图,上面的图都被抹掉了,下面的图就出来了,主要是PorterDuff和PorterDuffXfermode的利用,APIDEMO里面也有相关的介绍。好,贴出主要代码:

package com.picture;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.media.MediaPlayer;import android.os.Bundle;import android.util.DisplayMetrics;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;public class RemoveClothActivity extends Activity {private int SCREEN_W;private int SCREEN_H;private int imagePosition;private MediaPlayer mp3Player;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏Intent intent = getIntent();imagePosition = intent.getIntExtra("imagePosition", 0);initMP3Player();setContentView(new MyView(this));}private void initMP3Player(){mp3Player = MediaPlayer.create(RemoveClothActivity.this, R.raw.higirl);mp3Player.setLooping(false);}private void playMusic(){mp3Player.start();}class MyView extends View {private Bitmap mBitmap;private Canvas mCanvas;private Paint mPaint;private Path mPath;private float mX, mY;private static final float TOUCH_TOLERANCE = 4;public MyView(Context context) {super(context);setFocusable(true);setScreenWH();setBackGround();// 1.if icon1 is a image,you can open MENU_ITEM_COMMENT bellow// Bitmap bm = createBitmapFromSRC();// if you want to set icon1 image's alpha,you can open// MENU_ITEM_COMMENT bellow// bm = setBitmapAlpha(bm, 100);// if you want to scale icon1 image,you can open MENU_ITEM_COMMENT// bellow// bm = scaleBitmapFillScreen(bm);// 2.if icon1 is color// Bitmap bm = createBitmapFromARGB(0x8800ff00, SCREEN_W, SCREEN_H);int drawableId = 0;try {drawableId = R.drawable.class.getDeclaredField("pre" + imagePosition).getInt(this);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}Bitmap bm = scaleBitmapFillScreen(BitmapFactory.decodeResource(getResources(), drawableId));seticon1Bitmap(bm);}private void setScreenWH() {// get screen infoDisplayMetrics dm = new DisplayMetrics();dm = this.getResources().getDisplayMetrics();// get screen widthint screenWidth = dm.widthPixels;// get screen heightint screenHeight = dm.heightPixels;SCREEN_W = screenWidth;SCREEN_H = screenHeight;}private Bitmap createBitmapFromSRC() {return BitmapFactory.decodeResource(getResources(),R.drawable.icon1);}/** *  * @param colorARGB *            should like 0x8800ff00 * @param width * @param height * @return */private Bitmap createBitmapFromARGB(int colorARGB, int width, int height) {int[] argb = new int[width * height];for (int i = 0; i < argb.length; i++) {argb[i] = colorARGB;}return Bitmap.createBitmap(argb, width, height, Config.ARGB_8888);}/** *  * @param bm * @param alpha *            ,and alpha should be like ox00000000-oxff000000 * @note set bitmap's alpha * @return *//* * private Bitmap setBitmapAlpha(Bitmap bm, int alpha) { int[] argb = * new int[bm.getWidth() * bm.getHeight()]; bm.getPixels(argb, 0, * bm.getWidth(), 0, 0, bm.getWidth(), bm .getHeight()); *  *  * for (int i = 0; i < argb.length; i++) { *  * argb[i] = ((alpha) | (argb[i] & 0x00FFFFFF)); } return * Bitmap.createBitmap(argb, bm.getWidth(), bm.getHeight(), * Config.ARGB_8888); } *//** *  * @param bm * @param alpha *            ,alpha should be between 0 and 255 * @note set bitmap's alpha * @return */private Bitmap setBitmapAlpha(Bitmap bm, int alpha) {int[] argb = new int[bm.getWidth() * bm.getHeight()];bm.getPixels(argb, 0, bm.getWidth(), 0, 0, bm.getWidth(),bm.getHeight());for (int i = 0; i < argb.length; i++) {argb[i] = ((alpha << 24) | (argb[i] & 0x00FFFFFF));}return Bitmap.createBitmap(argb, bm.getWidth(), bm.getHeight(),Config.ARGB_8888);}/** *  * @param bm * @note if bitmap is smaller than screen, you can scale it fill the *       screen. * @return */private Bitmap scaleBitmapFillScreen(Bitmap bm) {return Bitmap.createScaledBitmap(bm, SCREEN_W, SCREEN_H, true);}private void setBackGround(){int drawableId = 0;try {drawableId = R.drawable.class.getDeclaredField("after" + imagePosition).getInt(this);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}setBackgroundResource(drawableId);}/** *  * @param bm * @note set icon1 bitmap , which overlay on background. */private void seticon1Bitmap(Bitmap bm) {// setting paintmPaint = new Paint();mPaint.setAlpha(0);mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));mPaint.setAntiAlias(true);mPaint.setDither(true);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeJoin(Paint.Join.ROUND);mPaint.setStrokeCap(Paint.Cap.ROUND);mPaint.setStrokeWidth(20);// set pathmPath = new Path();;// converting bitmap into mutable bitmapmBitmap = Bitmap.createBitmap(SCREEN_W, SCREEN_H, Config.ARGB_8888);mCanvas = new Canvas();mCanvas.setBitmap(mBitmap);// drawXY will result on that Bitmap// be sure parameter is bm, not mBitmapmCanvas.drawBitmap(bm, 0, 0, null);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawBitmap(mBitmap, 0, 0, null);mCanvas.drawPath(mPath, mPaint);super.onDraw(canvas);}private void touch_start(float x, float y) {mPath.reset();mPath.moveTo(x, y);mX = x;mY = y;}private void touch_move(float x, float y) {float dx = Math.abs(x - mX);float dy = Math.abs(y - mY);if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);mX = x;mY = y;}}private void touch_up() {mPath.lineTo(mX, mY);// commit the path to our offscreenmCanvas.drawPath(mPath, mPaint);// kill this so we don't double drawmPath.reset();}@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:touch_start(x, y);invalidate();break;case MotionEvent.ACTION_MOVE:touch_move(x, y);invalidate();break;case MotionEvent.ACTION_UP:touch_up();invalidate();playMusic();break;}return true;}}}

读书人网 >Android

热点推荐