Android自定义ViewGroup之浪漫求婚

今日科技快讯

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

长征精神,两学一做,杭州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

更多

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

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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android自定义ViewGroup是指在Android开发中,通过继承ViewGroup类来创建自定义的布局容器。自定义ViewGroup可以用于实现一些特殊的布局效果,比如侧滑菜单、滑动卡片等等。通过自定义ViewGroup,我们可以更灵活地控制子视图的布局和交互行为,以满足特定的需求。自定义ViewGroup的实现主要包括重写onMeasure()方法和onLayout()方法,来测量和布局子视图。同时,我们还可以通过重写onInterceptTouchEvent()方法和onTouchEvent()方法来处理触摸事件,实现自定义的交互效果。如果你对自定义ViewGroup还不是很了解,或者正想学习如何自定义,可以参考相关的教程和文档,如引用\[1\]和引用\[2\]所提到的博客和官方文档。 #### 引用[.reference_title] - *1* [Android 手把手教您自定义ViewGroup(一)](https://blog.csdn.net/iteye_563/article/details/82601716)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [使用LayoutParams自定义安卓ViewGroup](https://blog.csdn.net/lfq88/article/details/127268493)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android自定义ViewGroup](https://blog.csdn.net/farsight2009/article/details/62046643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值