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