添加这个 1px 透明边框并不像我想象的那么容易。在运行时添加它真的很麻烦。我的应用程序加载了很多位图,为了添加这个边框,我需要分配更多的位图来重绘它们。这确实破坏了堆,但是当我小心避免任何内存泄漏时,它按预期工作。真正让我丧命的是它引入的“滞后”。我追踪到了 GC 丢失的这种流动性。当他收回回收的位图时,最后一个似乎正在减慢 UI 线程。
使用缓存也不是解决方案。这是提高性能的最佳方式,但存储 500x500 PNG(需要 alpha)是不成比例的。
所以,我在这里,撞墙。我还没有尝试过“绘制时间”方式,但我的猜测是绘制到我认为不会是 HW acc 的屏幕外位图缓冲区。 (如果我错了,请纠正我)对我的事业没有帮助。
拥有“AA 着色器”的想法真的很诱人,我在这里看到了几个优势。它得到了硬件加速的良好支持,当然对于内存来说是一个奇迹(不再有野蛮的位图分配),并且可以完全独立于位图缩放。
我做了一个快速测试,这是迄今为止我设法获得的最好的 AA(这里我的意思是质量),而且……它很快……这个快速总结使用着色器进行了上边缘 AA。
BitmapShader bitmapShader = new BitmapShader(mBitmap,
TileMode.CLAMP, TileMode.CLAMP);
Matrix m = new Matrix();
m.postTranslate(0, 1);
bitmapShader.setLocalMatrix(m);
final LinearGradient AAshader = new LinearGradient(0, 0, 0, 1, 0x00000000, 0xffffffff, TileMode.CLAMP);
ComposeShader compositor = new ComposeShader(bitmapShader,
AAshader, PorterDuff.Mode.DST_IN);
mPaint.setShader(compositor);
canvas.drawRect(this.getBounds(), mPaint);
现在最大的缺点!如何获得 4 边 AA :) ???我们可能可以使用多步渐变来管理上/下边缘 AA,但这仍然很脏。一个不错的方法是将源位图与某种 9-patch 组合以获得透明边框,但我们无法合成 2 个位图着色器……所以,我又来了。如何获得这个面具着色器!该死的墙;)