Повернутые края ImageView не являются гладкими (неровными) - PullRequest
0 голосов
/ 04 апреля 2019

Образец NG ImageView: NG Rotated ImageView

В iOS я легко могу решить эту проблему с неровными краями с помощью view.layer.allowsEdgeAntialiasing = true.Каков наилучший способ решить эту проблему в Android?

Что я уже пробовал:
Я сослался на этот пост Растровое изображение не нарисовано с псевдонимом и установлено android:layerType="software"но результат по-прежнему NG.

<ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layerType="software"
        android:rotation="5"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/pic" />

Ожидаемый результат: сглаженные (сглаженные) края
Фактический результат: не сглаженные (зазубренные) края

1 Ответ

0 голосов
/ 31 мая 2019

Итак, после экспериментов, это лучшее, чего я мог достичь:

1) Тестовый вывод: НГ против ОК

2) Источник вывода NG

* только xml (в ConstraintLayout)

<ImageView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           app:layout_constraintTop_toTopOf="parent"
           app:layout_constraintStart_toStartOf="parent"
           app:layout_constraintEnd_toEndOf="parent"
           app:layout_constraintBottom_toBottomOf="parent"
           android:id="@+id/test3"
           app:srcCompat="@drawable/sampleImg"
           android:rotation="5"/>

3) OK выходной источник

* xml (под ConstraintLayout)

<test.ntfry.imageview_rotate_antialias.MyImageView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           app:layout_constraintTop_toTopOf="parent"                                   
           app:layout_constraintStart_toStartOf="parent"                                    
           app:layout_constraintEnd_toEndOf="parent"
           app:layout_constraintBottom_toBottomOf="parent"
           android:id="@+id/test2"/>

* Пользовательский класс ImageView

class MyImageView : AppCompatImageView {

    private val mPaint = Paint(Paint.ANTI_ALIAS_FLAG)
    private val mMatrix = Matrix()
    private var mRotatedBitmap: Bitmap? = null
    private val mRotation = 5F

    constructor(context: Context) : super(context, null) {
        init()
    }
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        init()
    }
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        init()
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        setMeasuredDimension(mRotatedBitmap!!.width, mRotatedBitmap!!.height)
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        canvas?.drawBitmap(mRotatedBitmap!!, 0f, 0f, mPaint)
    }

    private fun init() {
        // https://stackoverflow.com/questions/14378573/bitmap-not-drawn-anti-aliased
        setLayerType(LAYER_TYPE_SOFTWARE, null)

        // get source image and set-apply rotation through matrix
        val sourceBitmap = BitmapFactory.decodeResource(resources, R.drawable.sampleImg)
        mMatrix.postRotate(mRotation)
        mRotatedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.width, sourceBitmap.height, mMatrix, true)
    }
}

4) Если у вас есть лучшее решение, обязательно прокомментируйте / поделитесь своей идеей! Спасибо ^^

...