文档章节

Android进阶学习--十几行代码实现美女撕衣服效果

August1996_
 August1996_
发布于 2016/05/22 12:29
字数 481
阅读 45
收藏 0

    效果图:

    在这篇文章文章里有介绍过PorterDuffXfermode这个类,下面来用这个知识点来实现一下那种撕衣服的特效,先给两张图片:

上面叫做bg.jpg,下面叫做fg.jpg

然后就直接开始编码啦

1.布局文件:

<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="com.example.customview.MoveActivity" >

    <com.example.customview.GuaView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

</RelativeLayout>

2.编码文件:

package com.example.customview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class GuaView extends View {
	
	private Paint	mPaint;
	private Bitmap	bg;
	private Bitmap	fg;
	private Canvas	mCanvas;
	private Path	mPath;
					
	public GuaView(Context context) {
		this(context, null);
	}
	
	public GuaView(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}
	
	public GuaView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		
		bg = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
		fg = Bitmap.createBitmap(bg.getWidth(), bg.getHeight(), Bitmap.Config.ARGB_8888);
		/**
		 * fg必须使用这种方式去加载,不然默认加载的bitmap是不允许Canvas在上面画的
		 */
		
		mCanvas = new Canvas(fg);
		mCanvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.fg), 0, 0, null);
		/**
		 * 先把前面那张穿衣服的画上去
		 */
		
		mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		mPaint.setAlpha(0);
		mPaint.setStyle(Paint.Style.STROKE);
		mPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
		/**
		 * 这里的src是有衣服的那张fg
		 * dst是后面画上来的线条,后面画上来的区域
		 * 我们把后面画上来的区域alpha设置为透明
		 */
		mPaint.setStrokeWidth(50);
		mPath = new Path();
		
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				mPath.reset();
				mPath.moveTo(event.getX(), event.getY());
				break;
			case MotionEvent.ACTION_MOVE:
				mPath.lineTo(event.getX(), event.getY());
				break;
				
			default:
				break;
		}
		mCanvas.drawPath(mPath, mPaint);
		invalidate();
		return true;
	}
	/**
	 * 监听触摸事件,每次都把透明的线画上去,然后重绘View
	 */
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		canvas.drawBitmap(bg, 0, 0, null);
		canvas.drawBitmap(fg, 0, 0, null);
		/**
		 * 这时候我们就可以把背景跟fg画上去啦
		 * 其实最下面一层是bg(不穿衣服的),然后上一层是fg(穿衣服,但是经过图层符复合有些是透明显示的,这时候就能看到下面一层了)
		 */
	}
}

自己可以找两张美女的图片...

© 著作权归作者所有

共有 人打赏支持
August1996_
粉丝 2
博文 51
码字总数 29055
作品 0
湛江
程序员
私信 提问
Android实战经验之图像处理及特效处理的集锦(总结版)

1 Android学习笔记进阶之在图片上涂鸦(能清屏) 2 Android学习笔记之详细讲解画圆角图片 3 Android学习笔记进阶20之得到图片的缩略图 4 Android学习笔记进阶19之给图片加边框 5 Android学习笔...

xiaosi
2012/03/12
39.3K
25
Android项目刮刮奖详解扩展篇——开源刮刮奖View的制作

Android项目刮刮奖详解(四) 前言 我们已经成功实现了刮刮奖的功能了,本期是扩展篇,我们把这个View直接定义成开源控件,发布到JitPack上,以后有需要也可以直接使用,关于自定义控件的知识...

Stars-one
08/22
0
0
android高仿抖音、点餐界面、天气项目、自定义view指示、爬取美女图片等源码

Android精选源码 一个爬取美女图片的app(http://www.apkbus.com/thread-600077-1-1.html) Android高仿抖音(http://www.apkbus.com/thread-600081-1-1.html) android一个可以上拉下滑的Ui效果......

逆鳞龙
06/12
0
0
Android 学习小结

Android 学习已有一年半有余,先后做过两款游戏、三款应用和搭建一台服务端,也了解过一些Android相关的源码(JDK、SDK和NDK) 后来想学深入点,搞过两款开源项目(LGame 和 AChartEngine),...

长平狐
2013/01/06
165
0
Android电池电量监控初步

引言 ,学习了包括Activity、Service、AppWidget、Broadcast、Intent、Notification、XML布局、XML配置等基础知识之后,尝试着做一个小玩意儿——电池监控,期间也是阻挠多多,现在基本完成了...

鉴客
2012/01/29
3.6K
1

没有更多内容

加载失败,请刷新页面

加载更多

tomcat编译超过64k大小的jsp文件报错原因

  今天遇到一个问题,首先是在tomcat中间件上跑的web项目,一个jsp文件,因为代码行数实在是太多了,更新了几个版本之后编译报错了,页面打开都是报500的错误,500的报错,知道http协议返回...

SEOwhywhy
16分钟前
0
0
flutter http 请求客户端

1、pubspec文件管理Flutter应用程序的assets(资源,如图片、package等)。 在pubspec.yaml中,通过网址“https://pub.dartlang.org/packages/http#-installing-tab-”确认版本号后,将http(0...

渣渣曦
16分钟前
0
0
Django基本命令及moduls举例

一、Django基本命令 1.创建项目 django-admin.py startproject mysite 创建后的项目结构:- mysite - mysite #对整个程序进行配置 - init #导入包专用- settings ...

枫叶云
31分钟前
4
0
zabbix安装

rpm -ivh http://repo.webtatic.com/yum/el6/latest.rpm 安装jdk rpm -ivh (自行在网上下载rpm包) 安装php并修改相应参数 yum -y install php56w php56w-gd php56w-mysqlnd php56w-bcmath......

muoushi
32分钟前
3
0
MySQL自增属性auto_increment_increment和auto_increment_offset

MySQL的系统变量或会话变量auto_increment_increment(自增步长)和auto_increment_offset(自增偏移量)控制着数据表的自增列ID。 mysql> show tables;Empty set (0.00 sec)mysql> CREATE TA......

野雪球
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部