android撕衣服应用介绍

/**
 * 主要原理就是利用canvas绘制一层透明色,让后将穿完整衣服的那个图片绘制上。他们之前的层次模型为PorterDuff.Mode.DST_OUT;
 * View的draw的时候先绘制没穿衣服的那张图片,然后绘制刚才canvas绘制的两张图叠加起来的那张图;
 * 最后手触屏滑动的时候通过canvas的drawPath()进行绘制。
 * @author lucas
 *
 */
public class ShowGirlView extends View {

Bitmap new_bitmap;//声明Bitmap类
Bitmap back_bitmap;//声明Bitmap类
Bitmap fore_bitmap;//声明Bitmap类

Canvas mCanvas;//声明画布类
Paint paint;//声明画笔类
Path path;//画图类

int startX;//声明startX变量
int startY;//声明startY变量

int width;//声明width变量
int height;//声明height变量
int num;//声明num变量
Matrix matrix;//使用矩阵控制图片移动、缩放、旋转  
ImageResource imageRes;//声明ImageResource类


public ShowGirlView(Context context, int width, int height, int num) {//构造方法
super(context);
this.width = width;
this.height = height;
this.num = num;
init();
}


public ShowGirlView(Context context, AttributeSet attrs, int width, int height, int num) {//构造方法
super(context, attrs);
this.width = width;
this.height = height;
this.num = num;
init();
}


void init() {
imageRes = ImageResource.getImageResource();//实例化 ImageResource类

fore_bitmap = imageRes.getForeBitmap(getResources(), num);//实例化Bitmap类 temp_bitmap
back_bitmap = imageRes.getBackBitmap(getResources(), num);//实例化Bitmap类 back_bitmap

new_bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);//创建一个位图 ARGB_8888 代表32位ARGB位图

paint = new Paint();//实例化paint类 画笔类
paint.setAntiAlias(true);//设置画笔的锯齿效果
paint.setDither(true); //防抖动

mCanvas = new Canvas(new_bitmap);//实例化 画布 fore_bitmap类当参数
mCanvas.drawColor(Color.TRANSPARENT);//设置画布颜色为透明

matrix = new Matrix();
//缩放  它采用两个浮点数作为参数,分别表示在每个轴上所产生的缩放量。第一个参数是x轴的缩放比例,而第二个参数是y轴的缩放比例。
matrix.setScale(width * 1.0f / fore_bitmap.getWidth(), height * 1.0f / fore_bitmap.getHeight());

mCanvas.drawBitmap(fore_bitmap, matrix, paint);//绘制图像
fore_bitmap.recycle();//回收

        paint.setColor(Color.RED);//设置画笔颜色
        paint.setStrokeWidth(20);//设置描边宽度
        BlurMaskFilter bmf = new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL);//指定了一个模糊的样式和半径来处理Paint的边缘。
        paint. setMaskFilter(bmf);//为Paint分配边缘效果。
        paint.setStyle(Paint.Style.STROKE);//让画出的图形是空心的  
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));//它的作用是用此画笔后,画笔划过的痕迹就变成透明色了。画笔设置好了后,就可以调用该画笔进行橡皮痕迹的绘制了
        paint.setStrokeJoin(Paint.Join.ROUND);//设置结合处的样子 Miter:结合处为锐角, Round:结合处为圆弧:BEVEL:结合处为直线。
        paint.setStrokeCap(Paint.Cap.SQUARE);//画笔笔刷类型   方形形状

path = new Path();//实例化画图类
}


protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

canvas.drawBitmap(back_bitmap, matrix, null);//绘制图像
canvas.drawBitmap(new_bitmap, 0, 0, null);//绘制图像
}

public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();//获得触摸的X轴位置
int y = (int) event.getY();//获得触摸的Y轴位置
int position = event.getAction();//获得的返回值 获取触控动作比如ACTION_DOWN

int endX = 0;//声明变量endX
int endY = 0;//声明变量endY

switch (position){
case MotionEvent.ACTION_DOWN://当触摸时按下时
startX = x;
startY = y;
endX = x;
endY = y;
break;
case MotionEvent.ACTION_MOVE://当触摸移动时
endX = x;
endY = y;
break;
case MotionEvent.ACTION_UP://当触摸结束时
endX = x;
endY = y;
break;
}

path.moveTo(startX, startY);//起始点  
path.lineTo(endX, endY);//终点
mCanvas.drawPath(path, paint);//绘制图像

postInvalidate();//刷新界面

startX = endX;//将 endX值 也就是停止触摸时X轴的位置 付给 startX当中
startY = endY;//将 endY值 也就是停止触摸时X轴的位置 付给 startY当中

return true;
}

/**
* 用来回收内存
*/
public void realease(){
if(null != back_bitmap && !new_bitmap.isRecycled()){
back_bitmap.recycle();
}
if(null != new_bitmap && !new_bitmap.isRecycled()){
new_bitmap.recycle();
}
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值