Нарисуйте 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, который я пытаюсь нарисовать на холсте, поэтому на первом шаге я пытаюсь загрузить ресурс с заданным размером, что не требует дополнительного масштабирования. Кроме того, я понимаю, что есть лучший способ рисовать растровое изображение на холсте, без использования иерархии представления, но мне нужно, чтобы получить от него некоторые преимущества выравнивания (выравнивание текста по центру изображения или использование компоновки ограничений, автоматическое изменение размера текста и т. Д.)...)

РЕДАКТИРОВАТЬ 1 Вот пример: Большой круг нарисован нормально, у меньшего были артефакты

И если я увеличу скриншот

0 ответов

Другие вопросы по тегам