当前位置: 代码迷 >> Android >> android小运用帮美女更衣系列二(附源码)
  详细解决方案

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

热度:21   发布时间:2016-05-01 14:24:43.0
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;	@Override	protected 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 info			DisplayMetrics dm = new DisplayMetrics();			dm = this.getResources().getDisplayMetrics();			// get screen width			int screenWidth = dm.widthPixels;			// get screen height			int 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 paint			mPaint = 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 path			mPath = new Path();			;			// converting bitmap into mutable bitmap			mBitmap = 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 mBitmap			mCanvas.drawBitmap(bm, 0, 0, null);		}		@Override		protected 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 offscreen			mCanvas.drawPath(mPath, mPaint);			// kill this so we don't double draw			mPath.reset();		}		@Override		public 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;		}	}}

1 楼 y13872888163 2011-10-22  
很好 很邪恶
2 楼 xuye0451 2011-11-25  
居然带声音的。。。我是上班的时候研究你代码的。。。
3 楼 虎踞龙盘忆江南 2012-04-20  
 
  相关解决方案