文档章节

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 学习路线图

一个老鸟发的公司内部整理的 Android 学习路线图 jixiaohua发了一篇。另一份 Android 开发学习路线图。可惜不是MarkDown格式的,所以jixiaohua直接上传的截图,在jixiaohua的呼吁下,我花了些...

2eggs
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项目刮刮奖详解扩展篇——开源刮刮奖View的制作

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

Stars-one
08/22
0
0
最强最全干货分享:Android开发书籍、教程、工具等

最全干货分享,本文收集整理了Android开发所需的书籍、教程、工具、资讯和周刊各种资源,它们能让你在Android开发之旅的各个阶段都受益。 入门 《Learning Android(中文版)》 本书为Andro...

拉偶有所依
2015/01/09
0
1
【必看】Android干货整理

哗啦啦,为方便大家更好的学习交流,小编特地整理了一大波干货!预备 前方高能预警,一大波干货袭来,接住了!!!!!!!!!!!! 如果你是零基础小白,不知如何上手Android开发,不知应学习哪些工具...

慕课网官方_运营中心
08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
27
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部