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)
在我的情况下,我做了这个,但可能是你喜欢你做的:
Paint paint = new Paint();
paint.setAntiAlias(true);
Run Code Online (Sandbox Code Playgroud)
试一试.
祝好运!
| 归档时间: |
|
| 查看次数: |
16694 次 |
| 最近记录: |