位图未绘制消除锯齿

Eri*_*Kok 18 android android-custom-view android-canvas

我有一个习惯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();
}
Run Code Online (Sandbox Code Playgroud)

但是,我总是在Bitmap上出现锯齿状边缘.请注意,roudned矩形可以很好地消除锯齿边缘.此外,当我应用p.setFilterBitmap(true);此工作(位图表面被过滤/平滑)正确.我错过了什么吗?

照片上没有抗锯齿功能

这是一个最小的Android项目,其中一个屏幕的隔离示例显示了绘制从资源加载的非抗锯齿Bitmap的视图:https://bitbucket.org/erickok/antialiastest

更新:我也尝试了以下内容:

    Paint p = new Paint();
    p.setAntiAlias(true);
    p.setFilterBitmap(true);
    p.setDither(true);
    canvas.drawBitmap(someBitmap, 0, 0, p);
Run Code Online (Sandbox Code Playgroud)

但这对setFilterBitmap过滤表面没有帮助; 它不会对边缘进行反锯齿.此外,setAntiAlias与在Paint构造函数中直接设置标志相同.如有疑问,请尝试我的最小测试项目.非常感谢您的帮助!

Eri*_*Kok 20

我找到了为什么我没有得到任何抗锯齿:硬件加速.在我(通过纯粹意外)在我的Nexus One上测试后,它突然起作用,而我的Nexus 7没有.事实证明,使用硬件加速绘制ANTI_ALIAS_FLAG时什么都不做Canvas.凭借这种洞察力,我发现了Romain Guy在StackOverflow的答案,它回答了我的问题.

解决方案似乎是:为每个位图添加透明边框(手动或动态)或"使用着色器执行某些操作".对我来说都没有吸引力.相反,我使用该方法在我的自定义视图上禁用了硬件加速setLayerType.请注意,这可以从API级别11开始,但(不是偶然)您不必在任何方式之前处理硬件加速.所以我在视图构造函数中添加了:

    if (android.os.Build.VERSION.SDK_INT >= 11) {
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }
Run Code Online (Sandbox Code Playgroud)

我已经为BitBucket更新了上面提到的开源项目给那些感兴趣的人.


Swa*_*aul 19

使用setFilterBitmap(true).

paint_object.setFilterBitmap(true);
Run Code Online (Sandbox Code Playgroud)

它对我也有用..我从这个问题中得到了它

使用反别名绘制旋转的位图

AntiAlias标志和FilterBitmap标志设置为true,它们一起使位图的边缘平滑,我在三星Galaxy Ace上测试了它,android 2.2 ......

我的测试代码是

Paint p = new Paint();
p.setAntiAlias(true);
p.setFilterBitmap(true);
canvas.drawBitmap(someBitmap, new Matrix(), p);
Run Code Online (Sandbox Code Playgroud)


Ily*_*dov 6

在我的情况下,我做了这个,但可能是你喜欢你做的:

Paint paint = new Paint();
paint.setAntiAlias(true);
Run Code Online (Sandbox Code Playgroud)

试一试.

祝好运!