Нарисуйте VectorDrawable на холсте без сглаживания Android
Я пытаюсь нарисовать VectorDrawable
ресурс на холсте. То, как я это делаю сейчас, немного сложнее, поэтому пошаговый процесс выглядит так:
нагрузка VectorDrawable
из активов, установите желаемый размер, преобразуйте его в растровое изображение:
fun getBitmapFromVectorDrawable(context: Context, drawableId: Int, width:
Int, height: Int): Bitmap {
var drawable = ContextCompat.getDrawable(context, drawableId)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
drawable = DrawableCompat.wrap(drawable!!).mutate()
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
drawable.setBounds(0, 0, width, height)
drawable.isFilterBitmap = true
drawable.draw(canvas)
return bitmap
}
Вручную надуйте это представление:
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@id/img1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="fitCenter"/>
...
///ACTUALLY, THIS VIEW IS MORE COMPLICATED WITH TextView AND SOME OTHER VIEWS
</RelativeLayout>
Разметьте его с желаемым размером:
val widthSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.AT_MOST)
val heightSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST)
view.measure(widthSpec, heightSpec)
view.layout(0, 0, view.measuredWidth, view.measuredHeight)
Затем я устанавливаю растровое изображение на это изображение.
imageView.setImageBitmap(getBitmapFromVectorDrawable(view.context, drawableId, width, height))
Затем я рендеринг этого представления в растровое изображение, используя этот метод:
fun loadBitmapFromView(v: View, width: Int, height: Int): Bitmap {
v.isDrawingCacheEnabled = true
v.buildDrawingCache();
if (v.drawingCache != null)
return v.drawingCache
val b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val c = Canvas(b)
v.draw(c)
return b
}
И, наконец, нарисуйте его на холсте:
bitmap = loadBitmapFromView(view, width, height)
matrix.reset()
matrix.postTranslate(translation.left, translation.top)
canvas.drawBitmap(bitmap, matrix, null)
Мое тестовое изображение - простой круг. Если я пытаюсь нарисовать его маленьким (25px:25px), на краях будет много пиксельных артефактов. Переменные ширины и высоты из приведенного выше кода взяты из DrawingRect, который я пытаюсь нарисовать на холсте, поэтому на первом шаге я пытаюсь загрузить ресурс с заданным размером, что не требует дополнительного масштабирования. Кроме того, я понимаю, что есть лучший способ рисовать растровое изображение на холсте, без использования иерархии представления, но мне нужно, чтобы получить от него некоторые преимущества выравнивания (выравнивание текста по центру изображения или использование компоновки ограничений, автоматическое изменение размера текста и т. Д.)...)