一个快速但不那么彻底的解释,至少可以让你朝着正确的方向思考:
我认为这里要记住的重要一点是,无论您找到什么解决方案,动画都会非常缓慢,除非您完全在视图的 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 来查看圆形视图的一个很好的示例。图书馆里有很多好主意可以借用。
很抱歉没有整理出更完整的解释。这是一项相当复杂的任务!