Android 实现最新版QQ图像裁剪功能
2016-01-15 11:43
393 查看
这是根据翔神那篇高仿微信图像截取改的 可以先去看 Android 高仿微信头像截取 打造不一样的自定义控件 这篇文章。
目前还有个小问题,就是截取成圆形图片之后 会有黑色的边框填充。不知道怎么解决。知道怎么解决的大神麻烦告知一声。
修改ClipImageBorderView
修改 ClipZoomImageView
更改后的源码下载
目前还有个小问题,就是截取成圆形图片之后 会有黑色的边框填充。不知道怎么解决。知道怎么解决的大神麻烦告知一声。
修改ClipImageBorderView
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // // 计算矩形区域的宽度 // mWidth = getWidth() - 2 * mHorizontalPadding; // // 计算距离屏幕垂直边界 的边距 // mVerticalPadding = (getHeight() - mWidth) / 2; // mPaint.setColor(Color.parseColor("#aa000000")); // mPaint.setStyle(Style.FILL); // // 绘制左边1 // canvas.drawRect(0, 0, mHorizontalPadding, getHeight(), mPaint); // // 绘制右边2 // canvas.drawRect(getWidth() - mHorizontalPadding, 0, getWidth(), // getHeight(), mPaint); // // 绘制上边3 // canvas.drawRect(mHorizontalPadding, 0, getWidth() - // mHorizontalPadding, mVerticalPadding, mPaint); // // 绘制下边4 // canvas.drawRect(mHorizontalPadding, getHeight() - mVerticalPadding, // getWidth() - mHorizontalPadding, getHeight(), mPaint); // // 绘制外边框 // mPaint.setColor(mBorderColor); // mPaint.setStrokeWidth(mBorderWidth); // mPaint.setStyle(Style.STROKE); // canvas.drawRect(mHorizontalPadding, mVerticalPadding, getWidth() - // mHorizontalPadding, getHeight() - mVerticalPadding, mPaint); if (rf == null || rf.isEmpty()) { r = new Rect(0, 0, getWidth(), getHeight()); rf = new RectF(r); } mPaint.setStyle(Style.STROKE); // 在imageview上面画入背景和 圆形 int sc = canvas.saveLayer(rf, null, Canvas.MATRIX_S***E_FLAG | Canvas.CLIP_S***E_FLAG | Canvas.HAS_ALPHA_LAYER_S***E_FLAG | Canvas.FULL_COLOR_LAYER_S***E_FLAG | Canvas.CLIP_TO_LAYER_S***E_FLAG | Canvas.ALL_S***E_FLAG); mPaint.setColor(Color.parseColor("#aa000000")); mPaint.setStyle(Style.FILL); canvas.drawRect(r, mPaint); mPaint.setXfermode(cur_xfermode); // mPaint.setStyle(Style.STROKE); // 绘制圆形 canvas.drawCircle(getWidth() / 2, getHeight() / 2, mRadius, mPaint); // 绘制边框 canvas.drawCircle(getWidth() / 2, getHeight() / 2, mRadius, mBoderPaint); canvas.restoreToCount(sc); mPaint.setXfermode(null); }
修改 ClipZoomImageView
public Bitmap onClip() { // 获取imageview的bitmap Paint paint = new Paint(); invalidate(); setDrawingCacheEnabled(true); Bitmap bitmap = getDrawingCache().copy(getDrawingCache().getConfig(), false); setDrawingCacheEnabled(false); // 创建你要截取的位图 Bitmap bitmap2 = Bitmap.createBitmap(2 * mRadius, 2 * mRadius, Config.ARGB_8888); Canvas canvas = new Canvas(bitmap2); canvas.drawRoundRect(new RectF(0, 0, 2 * mRadius, 2 * mRadius), mRadius, mRadius, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); RectF dst = new RectF(-bitmap.getWidth() / 2 + mRadius, -getHeight() / 2 + mRadius, bitmap.getWidth() - bitmap.getWidth() / 2 + mRadius, getHeight() - getHeight() / 2 + mRadius); canvas.drawBitmap(bitmap, null, dst, paint); return bitmap2; }
更改后的源码下载
相关文章推荐
- Android AutoLayout全新的适配方式 堪称适配终结者
- AndroidManifest.xml乱码工具
- Android仿微博菜单弹出效果
- Android中Service服务详解(一)
- Android init.rc文件详
- jni编译问题:jin中添加LOG方法以及undefined reference to `__android_log_print'错误
- Android开发路线图
- 修改Android EditText光标颜色
- 【转】Android应用程序常见问题
- Android任务和返回栈完全解析(转)
- Android之日期及时间选择对话框
- 简单定制Android控件(3) - 打造通用的PopupWindow(一)
- Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!
- Android 布局优化之include与merge
- Android中attrs.xml文件的使用详解
- Android drivers/switch驱动详解(用于通过GPIO状态检测耳机、HDMI等的插拔状态)
- Android 支付宝支付开发
- android 应用的生命周期
- Android activity之间传值关键性代码
- Android手机 Fildder真机抓包