要求

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

分析

定义剪切浮层,实现背景资源图的操作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;

效果

Android截取人物头像,Android 图片截取人物头像(仿逗拍)相关推荐

  1. android 小米手机选择相册图片截取照片不进onActivityResult报“保存时发生错误,保存失败”

    小米选择相册时如果不使用系统截屏,直接压缩不会报"保存时发生错误,保存失败"的错误,如果截屏就会报如上错误. 需要把URI地址转为图片地址,再包成file文件转为URI Uri u ...

  2. Android项目中使用的图片选择器、头像裁剪和图片裁剪 Android 11可用

    在我们开发项目的时候,经常会涉及到头像上传和裁剪,针对这一需求我综合开源项目知乎的Matisse和国外的框架ucrop,实现了图片选择拍照和图片裁剪. 先看一下效果图 实现的方法 1.图片选择器的配置 ...

  3. android html 两行文字 一个图片,html 在头像旁边 两行文字

    效果预览: image.png 代码: Document .main { display: grid; width: 200px; grid-template-columns: 50px 70px 2 ...

  4. AI 图片截取、ffmpeg使用及安装, anaconda环境,图片标注(labelme),模型训练(yolov5),CUDA+Pytorch安装及版本相关问题

    AI 图片截取(ffmpeg), anaconda环境,图片标注(labelme),模型训练(yolov5),CUDA+Pytorch安装及版本相关问题 一.截取有效图片 录制RTSP视频脚本 #!/ ...

  5. 《Android开发卷——设置圆形头像,Android截取圆形图片》

    在有一些程序开发中,有时候会用到圆形,截取一张图片的一部分圆形,作为头像或者其他. 本实例就是截图圆形,设置头像的.      首先讲解一些代码 <ImageView android:id=&q ...

  6. android 判断字符相等,字符串的截取,判断字符串是否相等和字符串是否为空的方法总结Java,Android...

    最近做项目Android时遇到了字符串的截取,判断字符串是否相等和字符串是否为空问题刚好用的上自己也知道些,所以整理了方便以后用,和供大家参考,有什么更好的方法或者其它方法我么可以一起交流,谢谢大家! ...

  7. android 仿微信群聊头像 合成图片

    android 仿微信群聊头像 合成图片,微信中可以显示出群头像为多个用户的头像网格,这里讲方法已经封装好, 如果有记得点赞哦!! 先看效果: 使用例子: @Override public void ...

  8. android自定义头像上传,android裁切图片之用于头像上传

    嘛话都不说,直接贴代码,也是在网上找的代码copy出来的! 页面代码 encoding="utf-8"?> android:orientation="vertica ...

  9. Android 头像、图片裁剪

    ClipView 头像.图片裁剪 预览 裁剪圆形 裁剪圆角 裁剪矩形 资源 名字 资源 AAR clip_view.aar Gitee ClipView GitHub ClipView Maven 1 ...

最新文章

  1. Golden Software Surfer 17中文版
  2. Java的不同版本:J2SE、J2EE、J2ME的区别
  3. What's NEW in C++/CLI Language
  4. wxpython 多线程_在wxPython中使用线程连续更新GUI的好方法?
  5. 牛客网挑战赛24 青蛙(BFS)
  6. Linux下 对文件行数打乱(乱序排列)
  7. php extension,php的extension要开启哪些
  8. ubuntu14.04.5安装paramiko模块pip install paramiko出现一堆问题的解决过程
  9. 消息队列(MSMQ)学习
  10. 几家大的券商的PB系统以及算法交易概况大致是怎样的?
  11. debian 连接 蓝牙键盘
  12. 信号完整性(SI)电源完整性(PI)学习笔记(十)传输线的物理基础(三)
  13. android gif图片压缩,10种GIF压缩方法
  14. “反悔”贪心 烤鸡翅
  15. Python图片文字提取
  16. mysql数据倾斜_Hive SQL 数据倾斜总结
  17. 基于字的二元模型拼音输入
  18. 实践《如何使用Seata保证Dubbo微服务间的一致性》
  19. 软件测试知识点和面试题--app测试篇
  20. 多点多地网络改造方案

热门文章

  1. 2022建筑设计企业申报建筑设计资质流程
  2. C Runtime Library 与 STL
  3. 第一行代码天气预报接口更改后JSON键值对的问题
  4. JAVA表示姓名和对应的出生日期
  5. 滴滴云服务器快速配置搭建滴滴云GPU云服务器搭建深度学习环境
  6. Tableau制作全球电影数据分析/全球超市利润混合地图
  7. C++接口实现汉字拼音转换
  8. PayPal账户遭大规模冻结!跨境卖家如何自救?
  9. Netty案例(二)之耗时任务的处理
  10. android 六边形布局,Android自定义View——一个可定制的六边形阵列