Я пытаюсь анимировать/преобразовать прямоугольный вид/макет, так как все виды прямоугольные. Случай пользователя для этого был бы следующим: пользователь долго щелкает представление, которое содержит ImageView или просто основное представление с фоном, будет создано новое представление, являющееся размером экрана, тогда это представление сжимается в круг определенного размера. Возможное решение, которое я нашел, это расширение класса представления, поэтому создание моего собственного представления и реализация пользовательского метода, но я смущен тем, как оживить представление для сжатия. Кроме того, просмотр должен будет постоянно следить за местоположением пользователей, поскольку он оживляет/изменяет, добавляя больше к путанице.Morph a retangler view в круг
ответ
Быстро, не столь подробное объяснение, по крайней мере, получить вы думаете в правильном направлении:
Я думаю, что большая вещь, чтобы иметь в виду, здесь является то, что все, что решение, которое вы найдете, анимация будет быть мучительно медленным, если вы не выполните преобразования полностью в методе onDraw(Canvas canvas)
вида. Другими словами, избегайте всего, что требует просмотра для измерения и размещения для каждого кадра анимации. При таком подходе вы просто выполняете переход кадра и вызываете invalidate() в представлении для обновления. Имейте в виду, что вы потеряете большую часть своей способности взаимодействовать с чем-либо в представлении в своем круговом рендеринге.
Поскольку в Android нет анимации, трансформирующей фигуры, вам, вероятно, понадобится использовать что-то вроде Property Animation, чтобы катить ее самостоятельно. Если вы поддерживаете устройства до Honeycomb (3.0), вам, вероятно, понадобится добавить библиотеку NineOldAndroids и вместо этого использовать свои возможности анимации свойств. По сути, вам нужно оживить значения радиуса угла. Лучший сценарий, вы превращаете квадрат в круг. В противном случае вам также нужно выполнить некоторые преобразования или преобразования размеров.
Чтобы оживить представление, вам сначала необходимо получить растровое изображение, представляющее последний рендер этого вида. Вы можете сделать это, используя следующий код:
// Creates a bitmap in the size of the view
Bitmap bitmap = Bitmap.createBitmap(myView.getWidth(), myView.getHeight(), Bitmap.Config.RGB_565);
// Creates a new canvas that draws to the bitmap
Canvas canvas = new Canvas(bitmap);
// Draws the contents of the view to the bitmap via the canvas
view.draw(notifyCanvas);
Вы должны выполнить только один раз в анимации, и это должно происходить непосредственно перед выполнением анимации.
Затем вам, скорее всего, нужно будет создать пустой расширенный View
, чтобы сохранить анимированное представление вида, которое вы хотите изменить.
Реализация логики преобразования в onDraw(Canvas canvas)
(что делается путем расширения вида, как указано выше), у вас есть доступ к объекту Canvas. По существу, объект Canvas является последним слоем, содержащим все «призывы», которые отображают вид на экране. Перегружая метод onDraw
на новом пользовательском представлении, вы можете использовать canvas.drawRoundedRect(...)
для рисования прямоугольника с закругленными углами и рисования в растровом изображении, которое мы создали в приведенном выше коде. В пределах вашего пользовательского представления вы можете сохранить переменную, которая хранит радиус, используемый drawRoundedRect
. Когда вы живете, вы устанавливаете, что радиус будет больше и больше, пока вы не получите круг (предоставлено, вы получите только круг, если исходная фигура - это квадрат). Это довольно сложно, и я определенно пропустил несколько шагов, но вы можете увидеть хороший пример округленного представления, проверив RoundedImageView на GitHub. В этой библиотеке есть много хороших идей, которые вы могли бы взять взаймы.
Извинения за то, что не собрал более полное объяснение. Это довольно сложная задача!
Действительно, я размышлял об этом какое-то время и хотел получить внешнее мнение о том, стоит ли это делать или нет. Возможно, сверхурочные разработчики от android могли бы/могли бы реализовать больше возможностей анимации. Независимо от того, спасибо за ваши усилия, чтобы объяснить возможное решение этой проблемы. – user3005339
Задайте вопросы, чтобы уточнить, что вы ищете: должен ли анимироваться переход от прямоугольника к кругу? Является ли прямоугольник простой фигурой или растровой картиной с изображением в ней.На данный момент я не думаю, что одна матрица может выполнить переход, поэтому вам нужно будет вычислить новую позицию каждого пикселя и зашифровать/сгладить ее. С простой формой это будет 4 пикселя, с растровым рисунком еще много. – jboi