点击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;
}
}
}
- 大小: 378.6 KB
- 大小: 413.2 KB
- 大小: 248.5 KB
- 大小: 307.5 KB
分享到:
相关推荐
【标题】"(android源码)帮美女更衣"揭示了这是一个基于Android平台的游戏应用,其核心功能是允许用户操作游戏中的角色更换衣物。在Android开发中,源码是理解应用工作原理、学习编程技巧以及进行二次开发的重要...
在Android平台上,开发一款名为“帮美女更衣”的小游戏,涉及到许多关键的编程和技术知识点。首先,我们需要了解Android应用的基本架构,它通常基于组件模型,包括Activity、Service、BroadcastReceiver和...
【标题】"高仿帮美女更衣系列源码(1)"主要涉及到的是在Android平台上开发的一款模拟游戏的源代码,旨在提供一个类似"帮美女更衣"的应用体验。这样的应用通常包含各种服装、配饰的选择,用户可以自由搭配,为虚拟...
首先,“替美女更衣源码”指的是一款小游戏应用的源代码。此类游戏一般允许用户为虚拟角色更换衣物,这一过程不仅仅是为了娱乐,也为了提升游戏体验。源代码是整个游戏应用的根本,它包含了程序员精心设计的算法和...
Android removeClothForBeautyGirl_美女更衣安卓游戏Java源码,点击ImageSwitcher显示的图片即可切换到为美女换衣全屏界面,手指在界面上滑动,滑动处的衣服就被褪掉了。其实是两张图片,一张底图,一张上面的图,...
总结来说,利用"美女图片微信小程序源码"搭建小程序,需要掌握微信小程序开发的基本技能,理解源码结构,进行适当的二次开发,配置并运营广告,同时持续优化和推广。这是一条结合技术与营销的创新之路,对于想要在...
总结来说,"android 小游戏 美女密码源码" 是一个面向Android开发者的实践案例,它提供了从零开始了解和学习游戏开发的宝贵机会。无论是对Android应用开发感兴趣的新手,还是寻求新项目灵感的资深开发者,都能从中...
《Android游戏源码安卓美女拼图游戏》是一个适合Android初学者和高级开发者研究的项目,它揭示了Android游戏开发的基本原理和实践技巧。通过分析这个游戏的源码,我们可以深入理解Android应用开发的核心技术和游戏...
Android小游戏安卓游戏源码45款合集: 21点游戏源码.rar Angle v1.0.ZIP Barrage_OpenGLES.rar Billiard_2D.zip catcake-0.9.5-android.tar.gz Chess.rar Crackedcarrot.rar CrazyFootBall.zip EggGame.rar Elose-wr....
本项目是一个基于安卓的美女图片项目源码,被作者分成了气质、校花、时尚、素颜、唯美、清纯、可爱、长发、小清新、嫩萝莉等十多个分类,所有图片都是异步通过网络下载,以瀑布流的方式展示。大部分代码有详细的中文...
Android美女拼图源码是一个基于Android平台的休闲娱乐应用,它允许用户将预设或自定义的图片分割成若干小块,然后进行拼接,形成完整的图像。这个项目对于Android开发者来说,是学习游戏开发、图像处理以及用户体验...
【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大...
总的来说,"美女连连看"游戏源码展示了Android游戏开发的基本流程和技术要点,包括UI设计、图形算法、数据结构、状态管理以及架构模式的应用。对于想要学习Android游戏开发的开发者来说,这是一个很好的实践案例,...
本源码是一个妄撮chocolate的安卓版小游戏的项目源码,项目本身比较比较小实现也比较简单,只有四个java文件,源码没有注释,这类游戏用一句话概况就是:挑战裸露极限满足偷窥欲(听起来好吊),就是这样,需要的...
本文将围绕“Android小游戏(美女)”这个主题,详细讲解相关知识点,包括Android游戏开发基础、源码结构分析以及无广告改良版的实现。 一、Android游戏开发基础 1. Android SDK:所有Android应用开发都基于Android...
教程名称: 经典Android开发源码之游戏系【】【经典Android游戏源码10】Android钻石迷情源码【】【经典Android游戏源码11】2048小游戏源码【】【经典Android游戏源码12】Android简单炮台塔防小游戏源码【】【经典...
总结,通过分析这个“安卓美女拼图游戏第二版”的源码,开发者不仅可以掌握Android游戏开发的基本流程和技术,还能了解到如何将理论知识应用于实际项目中,从而提升自己的编程技能和解决问题的能力。对于有志于...
微信小程序是一种轻量级的应用开发平台,主要针对移动端,由腾讯公司推出,旨在提供便捷的、无需下载安装即可使用的应用体验。在这个“微信小程序开发-美女福利图片案例源码.zip”压缩包中,包含了用于教学或参考的...