Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
android自定义view的三大流程_浪漫又简单求婚方式,希望能够帮助你!!!。
正文
最终效果:
看整体效果这是一个 scrollView,滑动时每个 子view 都有一个或多个动画效果,但是如果我们直接给每个 子view 加上动画去实现这个需求就太low了,而且也不利于扩展,所以这里将会设计一套框架,使别人能很方便的使用我们定义的控件。
首先看看我们是怎么使用自己设计的这个控件的:
其中:
discrollve:discrollve_alpha="true"discrollve:discrollve_translation="fromLeft|fromBottom"
这里我们给系统控件加上自定义属性,这样当别人用我们的控件,简直不要太爽。
不过大家有没有发现这是系统控件哎,你就这么随随便便的给它加个属性,它认识么,不报错你就谢天谢地了,还让它工作,想的美。
带着这个疑惑,我们先来看看系统的 ViewGroup 类是怎么做的。
一般我们在代码中给布局动态添加子控件的时候都会用到 addView 这个方法。这里我们就跟踪这个方法,最后发现他们会调用到 ViewGroup 的 addview 方法。
有没有发现这里这里最后的 params 是怎么来的?不就是子控件的 params 么。而addView(child, index, params); 最后会调用 addViewInner
下面我们看下 addViewInner 是怎么做的
代码还是比较多的,只关注对我们有用的片段,首先它会调用 checkLayoutParams(params)
如果不等于空就会调用就调用 generateLayoutParams:
继续执行:
if (preventRequestLayout) { child.mLayoutParams = params; } else { child.setLayoutParams(params); }
看到上面的 checkLayoutParams 和 generateLayoutParams 方法都比较简单而且是protected的,所以应该是给子类实现的,我们看一个 viewgroup 的子类 LinearLayout是怎么做的:
看到这里就在想我们是不是也可以这么做呢,那当然是可以的。系统都可以了还有什么问题,接下来我们的大波代码来袭了:
上面这大段代码主要就做了我们上面分析的系统空间。
首先继承 LinearLayout,重写了 addView,generateLayoutParams,checkLayoutParams 并自定义了一个 MyLayoutParams 继承自 LinearLayout.LayoutParams
在 addview 的时候我们首先对 child 进行下处理,判断 子view 中是否有我们定义属性,没有的话,就用它自己,有的话,我们在外层包一个 FrameLayout,让他执行动画,他的 子view 也将跟着执行。
好了,框架的设计部分完成了,下面就是动画的实现了,首先看我们的 scrollView 是怎么做的:
主要就是在滑动的时候,把滑动的百分比传给接口 ,具体由接口的实现类来执行,而实现接口的类就是我们上面的那个 FrameLayout。
可以看出每个类都不是很大,当用户要用的时候只要在xml中引用我们的控件,就可以实现这个效果,而且他要别的效果的话同样只要在xml中配置就
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
下一篇
已是最新文章