我有一个自定义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();
}
但是,我总是对位图锯齿状边缘。 需要注意的是roudned矩形得到很好的消除锯齿边缘。 此外,当我申请p.setFilterBitmap(true);
这个工程(位图表面被过滤/平滑)正确。 我缺少的东西吗?
这里有一个屏幕的孤立的例子最小的Android项目,显示绘制非反锯齿位图的角度,从资源加载: 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
构造。 如有疑问,请尝尝我最小的测试项目。 非常感谢您的帮助!
我发现,为什么我没有得到任何抗锯齿:硬件加速。 之后,我(纯属偶然)在我的Nexus One测试它突然的工作,而我的Nexus 7没有。 原来, ANTI_ALIAS_FLAG
什么也不做,当Canvas
使用硬件加速绘制。 有了这种洞察力,我发现罗曼盖伊的StackOverflow上回答 ,回答我的问题。
解决方案似乎是:添加透明边框的每一个位图(手动或在飞行中)或“做着色器的东西”。 他们都不是很吸引我。 相反,我禁用硬件加速上使用我的自定义视图setLayerType
方法。 请注意,这是因为API级别11可用,但(不是偶然的),你将不必应付任何方式之前的硬件加速。 所以我加入,在视图中的构造函数:
if (android.os.Build.VERSION.SDK_INT >= 11) {
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
我已经更新为有志于在到位桶上面提到的开源项目。
使用setFilterBitmap(真)。
paint_object.setFilterBitmap(true);
它为我工作太..我从这个问题得到了它
绘制具有抗混叠旋转后的位
既消除锯齿标志和FilterBitmap标志设置为true,又一同做位图的边缘光滑,我已经测试了三星Galaxy王牌,Android 2.2的...
我的测试代码是
Paint p = new Paint();
p.setAntiAlias(true);
p.setFilterBitmap(true);
canvas.drawBitmap(someBitmap, new Matrix(), p);
在我来说,我这样做,但可能是它喜欢你做的事:
Paint paint = new Paint();
paint.setAntiAlias(true);
试一试。
祝好运!
我测试的是上建议,他们为我工作。 也许这些问题是在你的位图? 也许在你的设备? 下面是创建位图内嵌代码。 检查这个例子你的作品。
public class BitmapRotateActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}
class MyView extends View {
Bitmap bitmap;
public MyView(Context context) {
super(context);
bitmap = Bitmap.createBitmap(160, 160, Bitmap.Config.RGB_565);
Paint p = new Paint();
p.setColor(Color.RED);
p.setStyle(Paint.Style.FILL);
Canvas c = new Canvas(bitmap);
c.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), p);
}
@Override
protected void onDraw(Canvas canvas) {
Paint pbg = new Paint();
pbg.setStyle(Paint.Style.FILL);
pbg.setColor(0xffe0e0ff);
canvas.drawRect(0, 0, getWidth(), getHeight(), pbg);
Paint p = new Paint();
p.setAntiAlias(true);
p.setFilterBitmap(true);
canvas.save();
canvas.rotate(3F, getWidth() / 2, getHeight() / 2);
canvas.drawBitmap(bitmap, 30, 30, p);
canvas.restore();
}
}
}
我有同样的问题,并尝试了所有这些修正。 什么终于摸索被禁止全局硬件加速在AndroidManifest.xml文件中:
<application
android:hardwareAccelerated="false"
...
>
然后停用inSampleSize当我装我的图像位图,从而使(I假定)图像会以足够高的质量加载,以避免任何曲折,然后,为我的实际的ImageView,使用上述的建议:设置层类型,以查看.LAYER_TYPE_SOFTWARE,与设置为true(如上)和过滤器位图的涂料对象抗锯齿上。