高级UI8-自定义动画框架

问题一:如何让系统的控件(TextView)识别自定义属性?

思路:先看源码怎么去加载xml中定义的自带的属性和View的,入口是PhoneWindow的setContentView:


setContentView

再接着看LayoutInflater中的inflate方法:


inflate

加载每个子View的方法入口是:
image.png

rInflate

代码看到这里面我们就大概有了初步的思路,我们可以先用个自定义的LinearLayout包裹系统空间,然后重写generateLayoutParams方法,将我们自己定义的属性attrs重新替换传进去,这样我们就能在代码中使用我们自定义的属性了。

问题一的解决步骤:

步骤一:自定义LinearLayout:AnimationLinearLayout,重写addView和generateLayoutParams方法:

AnimationLinearLayout

步骤二:在AnimationLinearLayout中定义内部类AnimatorLayoutParams,在其构造方法内拿到自定义属性:

AnimatorLayoutParams

步骤三:自定义FrameLayout:AnimationFrameLayout

AnimationFrameLayout

AnimationFrameLayout作为子View的载体,负责添加每个子View,同时保存每个View的自定义属性,后续我们就可以通过AnimationFrameLayout来获取自定义属性了。

步骤四:自定义ScrollView:AnimationScrollView

在滚动时候监听控件滑动的占比,将得到的百分比通过接口回调的方式控制AnimationFrameLayout控件去执行动画:


AnimationScrollView

总结
外包装一个FrameLayout解决系统控件不能识别自定义属性的问题。
自己想要的动画,去限定(接口回调)到特定的监听控件当中。

你可能感兴趣的:(高级UI8-自定义动画框架)