专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
鸿洋  ·  WebView 经历的各种干货方案分享 ·  昨天  
郭霖  ·  提升 WebView ... ·  4 天前  
郭霖  ·  Android常见获取设备标识方法现状 ·  2 天前  
stormzhang  ·  钟睒睒的喊话,能改变什么? ·  3 天前  
郭霖  ·  iPhone 到 Android ... ·  1 周前  
51好读  ›  专栏  ›  郭霖

Android自定义ViewGroup之浪漫求婚

郭霖  · 公众号  · android  · 2016-12-22 08:00

正文

今日科技快讯

根据央视网消息,年度十大流行语、十大新词语和十大网络用语同时揭晓。

长征精神,两学一做,杭州G20峰会,南海,里约奥运会,脱欧,美国大选,亲信干政,天宫二号,阿尔法围棋 获评“2016年度十大流行语”。

两学一做,冻产,表情包,洪荒之力,阿尔法围棋,网络大电影,摩拜单车,山寨社团,吃瓜群众,闺蜜门 获评“2016年度十大新词语”。

洪荒之力,友谊的小船, 定个小目标,吃瓜群众,葛优躺,辣眼睛,全是套路,蓝瘦香菇,老司机,厉害了我的哥 当选“2016年度十大网络用语”。

作者简介

本篇来自 solary 有关自定义View的投稿,题材也是满6的,告诉我们程序员也是可以靠自己的技能来追妹子滴。。。感兴趣的朋友快来看看吧。

solary 的博客地址:

http://blog.csdn.net/asd1031

正文

最终效果:

有木有发现还是很小清新的感觉 

看整体效果这是一个 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中配置就好。

源码地址:

https://github.com/solary2014/ScrollViewGroup.git

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: