Android截取人物头像,Android 图片截取人物头像(仿逗拍)

要求

根据给定的头部模板,截取资源图。背景图可支持拖动,缩放,拖动旋转

113964_0.png

分析

定义剪切浮层,实现背景资源图的操作view

实现

绘制剪切浮层

/**

* 初始化绘制笔

*/

private void initRectPaint()

{

mFloatPaint = new Paint();

mFloatPaint.setAlpha(mAlpha);

mFloatPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR));

mEdgePaint = new Paint();

mEdgePaint.setColor(Color.parseColor(#ff000000));

mEdgePaint.setAlpha(mAlpha);

}

@Override

public void draw(Canvas canvas)

{

/** 绘制周围的背景色 **/

drawEdge(canvas);

/** 绘制中间浮层 **/

canvas.drawBitmap(mCropDrawable, mFloatRect.left, mFloatRect.top,

mFloatPaint);

}

操作图层手势

@Override

protected void onDraw(Canvas canvas)

{

canvas.save();

canvas.drawColor(Color.parseColor(#ff1c1c22));

canvas.drawBitmap(mBGHeadBitmap, mFloatRect.left, mFloatRect.top, null);

canvas.drawBitmap(mBGBitmap, mBGgmatrix, null);

mFloatView.draw(canvas);

canvas.restore();

}

//手势操作

public boolean onTouchEvent(MotionEvent event)

{

switch (event.getAction() & MotionEvent.ACTION_MASK)

{

case MotionEvent.ACTION_DOWN :

eventMode = EventMode.DRAG;

x_down = event.getX();

y_down = event.getY();

savedMatrix.set(mBGgmatrix);

break;

case MotionEvent.ACTION_POINTER_DOWN :

eventMode = EventMode.ZOOM;

oldDist = spacing(event);

mRotation = rotation(event);

savedMatrix.set(mBGgmatrix);

midPoint(midPoint, event);

break;

case MotionEvent.ACTION_MOVE :

if (eventMode == EventMode.DRAG)

{

matrix1.set(savedMatrix);

matrix1.postTranslate(event.getX() - x_down, event.getY()

- y_down);

mBGgmatrix.set(matrix1);

invalidate();

} else if (eventMode == EventMode.ZOOM)

{

float rotation = rotation(event) - mRotation;

float newDist = spacing(event);

float scale = newDist / oldDist;

/** 缩放 **/

float values[] = new float[9];

{

matrix1.set(savedMatrix);

matrix1.postScale(scale, scale, midPoint.x, midPoint.y);

}

/** 旋转 **/

matrix1.postRotate(rotation, midPoint.x, midPoint.y);

mBGgmatrix.set(matrix1);

invalidate();

}

break;

case MotionEvent.ACTION_UP :

case MotionEvent.ACTION_POINTER_UP :

eventMode = EventMode.NONE;

break;

}

return true;

}

获取剪切图片

Bitmap tmpBitmap = Bitmap.createBitmap(mScrrenWidth, mScrrenHeight,

Config.ARGB_8888); // 背景图片

Canvas canvas = new Canvas(tmpBitmap); // 新建画布

canvas.drawBitmap(mBGHeadBitmap, mFloatRect.left, mFloatRect.top, null);

canvas.drawBitmap(mBGBitmap, mBGgmatrix, null); // 画图片

canvas.save(Canvas.ALL_SAVE_FLAG); // 保存画布

canvas.restore();

Bitmap ret = Bitmap.createBitmap(tmpBitmap, mFloatRect.left,

mFloatRect.top, mFloatRect.width(), mFloatRect.height(), null,

true);

tmpBitmap.recycle();

tmpBitmap = null;

Bitmap newRet = Bitmap.createBitmap(mFloatRect.width(),

mFloatRect.height(), Config.ARGB_8888);

Canvas canvasHead = new Canvas(newRet);

canvasHead.drawBitmap(ret, 0, 0, null);

Paint paintHead = new Paint();

paintHead.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

Bitmap crop = BitmapFactory.decodeResource(mContext.getResources(),

R.drawable.headmask);

canvasHead.drawBitmap(crop, 0, 0, paintHead);

return newRet;

效果

113964_1.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值