我正在尝试动画/变形矩形视图/布局,因为所有视图都是矩形的。用户的用例如下:用户长按包含ImageView的视图或仅包含背景的主视图,将生成一个与屏幕大小相同的新视图,然后此视图将缩小为一个圆圈一定的规模。我发现可能的解决方案是扩展视图类,因此创建我自己的视图并实现自定义方法,但我对如何动画视图缩小感到困惑。此外,视图必须在动画/变形时连续跟随用户触摸位置,从而增加了混乱。
答案 0 :(得分:2)
快速,不那么彻底的解释,至少让你思考正确的方向:
我认为在这里要记住的重要一点是,无论你找到什么解决方案,除非你在视图的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来看到一个圆形视图的好例子。你可以借阅图书馆里有很多好主意。
抱歉没有提出更全面的解释。这是一项非常复杂的任务!