【问题标题】:Morph a retangler view into a circle [closed]将 retangler 视图变形为圆形[关闭]
【发布时间】:2013-11-18 15:44:22
【问题描述】:

我正在尝试对矩形视图/布局进行动画处理/变形,因为所有视图都是矩形的。这种情况的用户案例是:用户长按包含 ImageView 的视图或仅具有背景的主视图,将生成一个与屏幕大小相同的新视图,然后该视图将缩小为一定大小。我发现可能的解决方案是扩展视图类,因此创建我自己的视图并实现自定义方法,但我对如何动画视图以缩小感到困惑。此外,视图必须在动画/变形时连续跟随用户触摸位置,从而增加更多混乱。

【问题讨论】:

  • 一个视图问题来澄清,你在寻找什么:从矩形到圆形的过渡是否应该是动画的?矩形只是一个简单的形状还是一个带有图片的位图。目前我不认为单个矩阵可以进行转换,因此您需要计算每个像素的新位置并对其进行抖动/抗锯齿。对于简单的形状,这将是 4 像素,而位图则更多。

标签: android animation layout drawable shapes


【解决方案1】:

一个快速但不那么彻底的解释,至少可以让你朝着正确的方向思考:

我认为这里要记住的重要一点是,无论您找到什么解决方案,动画都会非常缓慢,除非您完全在视图的 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 使用的半径。在制作动画时,您将半径设置得越来越大,直到得到一个圆圈(当然,如果原始形状是正方形,您只会得到一个圆圈)。这确实变得相当复杂,我肯定跳过了几个步骤,但是您可以通过查看 GitHub 上的 RoundedImageView 来查看圆形视图的一个很好的示例。图书馆里有很多好主意可以借用。

很抱歉没有整理出更完整的解释。这是一项相当复杂的任务!

【讨论】:

  • 确实,我一直在考虑这个问题,并想就这是否值得做外部意见。也许加班来自android的开发人员会/可以实现更多的动画功能。无论如何,感谢您为解释此问题的可能解决方案所做的努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 2014-03-23
  • 1970-01-01
  • 2013-05-04
  • 2017-11-20
  • 1970-01-01
相关资源
最近更新 更多