【发布时间】:2015-09-01 12:10:05
【问题描述】:
我正在创建一个自定义 ImageView,它将我的图像裁剪成六边形并添加边框。我想知道我的方法是正确的还是我做错了。有一堆自定义库已经做到了这一点,但没有一个开箱即用的库具有我正在寻找的形状。话虽如此,这更多是关于最佳实践的问题。
您可以在gist 中看到完整的课程,但主要问题是这是最好的方法。这对我来说感觉不对,部分原因是一些神奇的数字,这意味着它可能在某些设备上被搞砸了。
这是代码的核心:
@覆盖 受保护的无效onDraw(帆布画布){ 可绘制可绘制 = getDrawable(); if (drawable == null || getWidth() == 0 || getHeight() == 0) { 返回; } 位图 b = ((BitmapDrawable) 可绘制).getBitmap(); 位图 bitmap = b.copy(Bitmap.Config.ARGB_8888, true); int dimensionPixelSize = getResources().getDimensionPixelSize(R.dimen.width); // (ImageView的宽高) 位图drawBitmap = drawCanvas(bitmap, dimensionPixelSize); canvas.drawBitmap(drawnBitmap, 0, 0, null); } 私人位图drawCanvas(位图回收位图,int宽度){ 最终位图位图 = verifyRecycledBitmap(recycledBitmap, width); 最终位图输出 = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888); 最终画布画布=新画布(输出); final Rect rect = new Rect(0, 0, width, width); final int offset = (int) (width / (double) 2 * Math.tan(30 * Math.PI / (double) 180)); // (宽度 / 2) * tan(30deg) 最终 int 长度 = 宽度 - (2 * 偏移量); 最终路径 path = new Path(); path.moveTo(width / 2, 0); // 顶部 path.lineTo(0, offset); // 左上角 path.lineTo(0, offset + length); // 左下角 path.lineTo(width / 2, width); // 底部 path.lineTo(宽度, 偏移 + 长度); // 右下角 path.lineTo(宽度,偏移); // 右上角 path.close(); //回到顶部 油漆油漆 = 新油漆(); 油漆.setStrokeWidth(4); canvas.drawARGB(0, 0, 0, 0); canvas.drawPath(路径,油漆); paint.setXfermode(新 PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(位图,矩形,矩形,油漆); // 绘制图像的位图 paint.setColor(Color.parseColor("white")); 油漆.setStrokeWidth(4); 油漆.setDither(true); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); paint.setPathEffect(新 CornerPathEffect(10)); paint.setAntiAlias(true); // 绘制边框 canvas.drawPath(路径,油漆); 返回输出; }我正在查看一些 iOS 代码,他们能够应用实际图像作为蒙版来实现此结果。无论如何,Android 上是否有这样的功能?
【问题讨论】:
-
也许this 适合您的需求?
-
我想说,让你的笔触宽度、偏移量 + X 和 CornerPathEffect 转换为 dp 的像素(使用 TypedValue),但除此之外,它看起来还不错。 30 度很好,因为 30 度在任何设备(或宇宙中的任何地方)上都是 30 度
-
@GilMoshayof 谢谢,我想我正在查看一些 iOS 代码,他们能够在他们的图像上应用 svg 作为图层。我希望我在 Android 中缺少一些东西可以让我做到这一点。
标签: android imageview android-canvas