文档章节

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

August1996_
 August1996_
发布于 2016/05/22 12:29
字数 481
阅读 45
收藏 0
点赞 2
评论 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高仿抖音、点餐界面、天气项目、自定义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

老生常谈Android的MVP架构

原生框架问题 由于原生 Android 开发应该已经是一个基础的 MVC 框架,所以在初始开发的时候并没有遇到太多框架上的问题,可是一旦项目规模到了一定的程度,就需要对整个项目的代码结构做一个...

LaxusJ ⋅ 04/23 ⋅ 0

android --------学习流程图

如何快速入门和进阶安卓开发,是很多技术小白的疑问。 大家都知道,Android开发要学的技能非常多,技术更新速度还快,但是总的来说:掌握最核心的技术,最规范的开发流程,成为专业、出色的安...

切切歆语 ⋅ 05/06 ⋅ 0

Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图之用例图 Android 架构师之路2 UML图之类图 Android 架构师之路3...

香沙小熊 ⋅ 今天 ⋅ 0

Android HookActivity一行代码实现开屏广告

需求背景 多个产品线都需要实现开屏广告,我们产品广告都是接的我们自家广告SDK,而只是几行代码请求我们广告,广告SDK会把View封装好返回来,要做的事情只是获取响应结果,并且出来. 如何实...

xwdz ⋅ 05/09 ⋅ 0

Canvas上drawText的进阶

前言 使用Canvas的drawText绘制文本是不会自动换行的,即使一个很长很长的字符串,drawText也只显示一行,超出部分被隐藏在屏幕之外。 那么TextView这样的控件是如何处理这个问题的呢?实际上...

街角的小丑 ⋅ 05/17 ⋅ 0

smart-ioc 首版发布:为 Android 打造的国产 NIO 通信框架

项目背景 在几年前作者便开始NIO的学习与研究,并在码云上提交了第一个作品smart-socket(NIO版)。本来期望将其打造成异步非阻塞的通信框架,如同netty一样,却最终效果并不理想。恰逢Java ...

三刀蜀黍 ⋅ 05/28 ⋅ 13

《App架构师实践指南》:移动开发的进阶指南

文章主要内容: 什么是 app 架构师 这本书主要内容 读完感受 什么是 App 架构师 成为“架构师”是许多程序员的梦想,当然也包括我,在工作的几年里,我见过很多架构师,他们在设计某个大型系...

异步社区 ⋅ 05/29 ⋅ 0

Matrix, ColorMatrix

作为Android源码中的一个常用类,它的作用是持有一个3*3的矩阵数组,用于坐标的转换。 Matrix用来制作动画效果、改变图片大小、给图片加各类滤镜等。 Matrix 的应用 - 压缩图像;Matrix 的应...

shareus ⋅ 04/13 ⋅ 0

官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?

Kotlin KTX 2月5号的时候,Google 发布了一款 Kotlin 的扩展库,叫 Android KTX,不过现在还处于预览版的状态。它能使 Android 上的 Kotlin 代码更简洁,从而提高开发者的效率和使用体验。 ...

承香墨影 ⋅ 02/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

分布式数据库中间件DDM的实现原理

随着数据量不断增大,传统的架构模式难以解决业务量不断增长所带来的问题,特别是在业务成线性、甚至指数级上升的情况。此时我们不得不通过水平扩展,把数据库放到不同服务器上来解决问题,也...

中间件小哥 ⋅ 15分钟前 ⋅ 0

字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8

原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享。 1、引言 今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料。 这个问题比我想象的复杂,午饭...

JackJiang- ⋅ 22分钟前 ⋅ 0

Spring Cloud构建微服务架构:服务消费(基础)

使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient、这里我们即将介绍的LoadBalancerClient等。对于这些接口的定义我们在上一篇介...

itcloud ⋅ 23分钟前 ⋅ 0

MaxCompute产品最新进展 -- 从马力到计算力

摘要:本文从马力作为功率衡量标准为切入点,介绍了大数据领域的计算力衡量标准TPCBB以及MaxCompute2.0在Big Bench上的卓越表现。同时详细地分享了取得优异成绩背后的产品在最新有哪些进展,...

猫耳m ⋅ 23分钟前 ⋅ 0

Linux系统

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Linux系统: Unix:是C语言转做出来的,最早的网...

凯哥学堂 ⋅ 23分钟前 ⋅ 0

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

13.1 设置更改root密码 启动MySQL数据库 [root@linux-10 ~]# /etc/init.d/mysqld startStarting MySQL SUCCESS! 由于MySQL的相关命令的所在路径不在系统的环境变量中,因此需要将路径添...

影夜Linux ⋅ 26分钟前 ⋅ 0

jeesite shiro+redis实现cache和session共享

jeesite这个开源框架本身集成的有shiro+redis来实现cache和session共享,但是需要修改一下文件配置即可 首先找到spring-context-shiro.xml文件 找到bean id为sessionDAO,将其修改为如下 <!...

wangxujun59 ⋅ 26分钟前 ⋅ 0

基本JNI搭建

1、编写Java代码 首先我们需要编写自己的java代码 public class Hello { static{ System.loadLibrary("hello-jni"); } public native String sayHello();} 2、把...

国仔饼 ⋅ 28分钟前 ⋅ 0

MaxCompute产品最新进展 -- 从马力到计算力

摘要:本文从马力作为功率衡量标准为切入点,介绍了大数据领域的计算力衡量标准TPCBB以及MaxCompute2.0在Big Bench上的卓越表现。同时详细地分享了取得优异成绩背后的产品在最新有哪些进展,...

阿里云云栖社区 ⋅ 32分钟前 ⋅ 0

AppDelegate 设置Root相关

self.window = UIWindow.init(frame: UIScreen.main.bounds) self.window?.backgroundColor = UIColor.white self.window?.makeKeyAndVisible() self.window?.rootViewController = RootTabB......

west_zll ⋅ 40分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部