/**
* 主要原理就是利用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();
}
}
}
* 主要原理就是利用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();
}
}
}