我有一个自定义的View
,总是在固定的旋转角度下绘制一个Bitmap
。 我重写了onDraw
方法,旋转Canvas
并使用抗锯齿Paint
绘制位图。
public RotatedImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
someBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.placeholder);
}
@Override
protected void onDraw(Canvas canvas) {
// Save and rotate canvas
canvas.save();
canvas.rotate(3F, getWidth() / 2, getHeight());
// Draw the icon
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
canvas.drawBitmap(someBitmap, 0, 0, p);
canvas.drawRoundRect(new RectF(75, 50, 225, 200), 10, 10, p);
// All done; restore canvas
canvas.restore();
}
然而,我在位图上总是得到了锯齿状的边缘。请注意,圆角矩形的边缘得到了很好的反锯齿处理。此外,当我应用p.setFilterBitmap(true);
时,这个方法可以正确地过滤/平滑位图表面。我错过了什么吗?
这是一个最小化的Android项目,其中包含一个屏幕的被隔离的例子,演示了从资源中加载的未抗锯齿位图的绘制View:https://bitbucket.org/erickok/antialiastest
更新:我也尝试了以下操作:
Paint p = new Paint();
p.setAntiAlias(true);
p.setFilterBitmap(true);
p.setDither(true);
canvas.drawBitmap(someBitmap, 0, 0, p);
但是这并没有帮助,因为setFilterBitmap
只过滤表面;它不会抗锯齿边缘。而且,setAntiAlias
与直接在Paint
构造函数中设置标志相同。如果有疑问,请尝试我的最小测试项目。非常感谢您的任何帮助!
setFilterBitmap()
结合setLayerType(View.LAYER_TYPE_SOFTWARE, null)
对我来说非常有效。仅使用软件层仍然存在一些伪影。 - Brian