Любой, кто работал с пользовательскими представлениями Android, знаком с методом onDraw. Здесь мы рисуем вид на холст Android, который будет отображаться на экране.

Нам нужно было создать представление, которое будет вращаться в соответствии с заданным значением viewRotation. Итак, мой метод рисования выглядел так.

override fun draw(canvas: Canvas?) {
 
    canvas?.rotate(viewRotation, (canvas.width/2).toFloat(),   (canvas.height/2).toFloat())

    super.draw(canvas)
}

Здесь холст поворачивается так, что его центр является точкой поворота. Все нормально работает. Вид поворачивается и отображается на экране в соответствии с заданным значением viewRotation.

Все выглядело хорошо, пока мы не захотели сделать снимок экрана с макетом.

Bitmap.createScaledBitmap(v.drawingCache, width, height, false)

Снимок экрана выглядел совершенно иначе; наш вид был обрезан, и позиция была совершенно другой, чем мы ожидали.

После щедрого добавления вызовов Log.d в базу кода кое-что привлекло наше внимание. Когда мы зарегистрировали высоту и ширину холста.

Log.d(TAG,"width -> ${canvas.width} , height -> ${canvas.height}")

Журналы показали, что при использовании макета высота и ширина холста были такими же, как высота и ширина представления.

width -> 1008 , height -> 768

Но когда мы пытаемся сделать снимок экрана, холст вернул высоту и ширину как высоту и ширину экрана.

width -> 1340 , height -> 2048

Вот почему растровое изображение обрезано, вид поворачивается с неправильной точкой поворота. Проблема была устранена за счет использования высоты и ширины представления вместо высоты и ширины холста. Окончательный код

canvas?.rotate(viewRotation, (width/2).toFloat(), (height/2).toFloat())

Это прекрасно работает. Необходимо проверить, почему высота и ширина холста несовместимы. Но это в другой день.