我有一个简单的位图,在画布内绘制并使用矩阵旋转。
问题在于,当使用硬件加速时,旋转后的边缘没有反锯齿效果(关闭硬件加速时可以完美工作)。
当然,像“setDrawFilter”之类的东西在打开硬件加速时被忽略了!
canvas.setDrawFilter(new PaintFlagsDrawFilter(1, Paint.ANTI_ALIAS_FLAG));
我是否遗漏了什么或只是硬件渲染方法的限制?是否有其他选择?
我有一个简单的位图,在画布内绘制并使用矩阵旋转。
问题在于,当使用硬件加速时,旋转后的边缘没有反锯齿效果(关闭硬件加速时可以完美工作)。
当然,像“setDrawFilter”之类的东西在打开硬件加速时被忽略了!
canvas.setDrawFilter(new PaintFlagsDrawFilter(1, Paint.ANTI_ALIAS_FLAG));
在绘制中设置抗锯齿标志也无济于事。要在旋转位图时获得抗锯齿边框,您应该在其周围添加一个1像素的透明边框。
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个bitmapShader… 所以,我又来了。如何获得这个掩码着色器!该死的墙壁 ;)
private void fixAntiAlias(View viewFromThe80s) {
if (Build.VERSION.SDK_INT > 10) {
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.FILTER_BITMAP_FLAG);
viewFromThe80s.setLayerType(View.LAYER_TYPE_SOFTWARE, p);
((View) viewFromThe80s.getParent()).setLayerType(View.LAYER_TYPE_SOFTWARE, p);
}
}
我的TextView使用了9-patch作为背景,因此我无法添加透明的1像素边框而不影响9-patch像素。所以,相反地,我通过禁用给定视图及其父级的硬件加速来使其正常工作:
我在视图膨胀后立即调用此函数。具体来说,在我的情况下是在onCreateViewHolder
中(确切地说是在viewholder构造函数中)。这修复了我的旋转TextView,它使用类似以下内容的NinePatchDrawable背景:
<TextView
android:id="@+id/text_new_feature"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:rotation="-30"
android:background="@drawable/background_new_feature"/>