点击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
* <a href="%5C%22http://www.eoeandroid.com/home.php?mod=space&uid=7300%5C%22" target="\"_blank\"">@return</a>
*/
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;
}
}
} </i></i></i></i></i>

用android程序帮美女换衣服源码相关推荐

  1. Android Jetpack组件之 Paging使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  2. android 使用4大组件的源码,Android Jetpack架构组件之 Paging(使用、源码篇)

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  3. Android技术栈--HashMap和ArrayMap源码解析

    1 总览 WARNING!!:本文字数较多,内容较为完整并且部分内容难度较大,阅读本文需要较长时间,建议读者分段并耐心阅读. 本文会对 Android 中常用的数据结构进行源码解析,包括 HashMa ...

  4. Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  5. Android Jetpack组件之Navigation使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  6. Android Jetpack组件之 Room使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  7. Android Jetpack组件之 LiveData使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  8. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )

    文章目录 前言 一.ActivityManagerService.attachApplicationLocked 二.ActivityStackSupervisor.attachApplication ...

  9. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 二 )

    文章目录 前言 一.ActivityThread 类 handleLaunchActivity -> performLaunchActivity 方法 二.Instrumentation.new ...

  10. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 一 )

    文章目录 前言 一.ClientTransactionHandler.scheduleTransaction 二.ActivityThread.H 处理 EXECUTE_TRANSACTION 消息 ...

最新文章

  1. 深度学习100问:图像语义分割有哪些经典的上采样方法?
  2. shell 脚本 变量 获取程序输出结果异常分析
  3. 利用iconv进行文件编码批量原地转换
  4. 【错误记录】Android Studio 配置 GitHub 报错 ( Can‘t login using given credentials: Request response: 401 Una )
  5. Activity管理
  6. 光速OFFER,为AI奔赴,商汤2022届校招提前批正式启动!
  7. Excel多因素可重复方差分析
  8. 很多字段的数据要插入另一张表_一文看懂数据库设计之逻辑设计,值得收藏
  9. linux nodejs环境部署,Linux 部署Nodejs 环境 (自学记录篇)
  10. 物理数据模型(PDM)-概念数据模型 (CDM)-面向对象模型 (OOM):适用于已经设计好数据库表结构了。...
  11. C#中实现对象的深拷贝
  12. linux3.0-内核自带led驱动移植
  13. 前端 JavaScript 之『节流』的简单代码实现
  14. BP神经网络简单应用实例,bp神经网络的应用案例
  15. 网易To B的差异化路线
  16. charles SSL证书安装
  17. 普渡大学统计与计算机科学,普渡大学西拉法叶分校统计学
  18. stc和sac_SAC与短期边际成本SMC.PPT
  19. leetcode 183. Customers Who Never Order
  20. java汉字获取拼音的方法

热门文章

  1. PreferenceActivity使用介绍
  2. PJzhang:QQ输入法用户许可协议和隐私政策阅读
  3. BackTrack4安装中文语言包
  4. java安装了怎么打开_怎么安装打开java
  5. 【数据挖掘】电商数据合集
  6. python3的字符串操作
  7. 十款提升操作系统舒服度软件
  8. 一个游戏策划案(仅供参考)
  9. Redis 五大数据类型的基本命令使用
  10. 【概率论与数理统计】目录