У меня есть пользовательский 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 с изолированным примером одного экрана, который показывает представление, которое рисует не сглаженный 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);
Но это не помогает, поскольку setFilterBitmap
фильтрует поверхность; он не сглаживает края. Кроме того, setAntiAlias
делает то же самое, что непосредственно устанавливает флаг в конструкторе Paint
. Если есть сомнения, попробуйте мой минимальный тестовый проект. Большое спасибо за любую помощь!