位置: 编程技术 - 正文
推荐整理分享Android自定义之流式布局(android自定义控件入门与实战),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:android 自定义spinner,安卓自定义app,android 自定义view三个方法,安卓自定义app,android自定义属性详解,android自定义属性详解,android 自定义view三个方法,android自定义属性详解,内容如对您有帮助,希望把文章链接给更多的朋友!
流式布局,好处就是父类布局可以自动的判断子孩子是不是需要换行,什么时候需要换行,可以做到网页版的标签的效果。今天就是简单的做了自定义的流式布局。
具体效果:原理:其实很简单,Measure Layout。只需要这两个步骤就可以搞定了。完全的手动去Measure Layout。我们看一下代码。解释就在代码里面做注释了,因为使用为知笔记写的博客,式不符合代码式。大家可以看具体的源码。最后又源码下载地址。1.Measure 测量 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthSize = MeasureSpec.getSize(widthMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int lineHeight = 0 ; int lineWidth = 0 ; int width = 0 ; int height = 0 ; int childCount = getChildCount(); Log.i("Test", getPaddingLeft() "==right=" getPaddingRight()); for (int i = 0; i < childCount; i) { View childView = getChildAt(i); measureChild(childView, widthMeasureSpec, heightMeasureSpec); MarginLayoutParams params = (MarginLayoutParams) childView.getLayoutParams(); int childWidth = childView.getMeasuredWidth() params.leftMargin params.rightMargin ; int childHeight = childView.getMeasuredHeight() params.topMargin params.bottomMargin ; if ((lineWidth childWidth ) > widthSize - getPaddingLeft() - getPaddingRight() ) { width = Math.max(width, lineWidth); lineWidth = childWidth ; height = lineHeight ; lineHeight = childHeight; }else { lineWidth = childWidth ; lineHeight = Math.max(lineHeight, childHeight); } if (i == childCount-1) { width = Math.max(width, lineWidth); height = lineHeight ; } } height = getPaddingTop() getPaddingBottom() ; setMeasuredDimension(widthMode == MeasureSpec.EXACTLY?widthSize:width, heightMode == MeasureSpec.EXACTLY?heightSize:height); }2.onLayout 布局 @Override protected void onLayout(boolean a, int l, int t, int r, int b) { childViewList.clear(); int childCount = getChildCount() ; int width = getWidth(); int lineWidth = 0 ; int lineHeight = 0 ; List<View> lineViews = new ArrayList<View>(); for (int i = 0; i < childCount; i) { View childView = getChildAt(i); MarginLayoutParams params = (MarginLayoutParams) childView.getLayoutParams(); int childWidth = childView.getMeasuredWidth() params.leftMargin params.rightMargin ; int childHeight = childView.getMeasuredHeight() params.topMargin params.bottomMargin ; if (lineWidth childWidth > width - getPaddingLeft() - getPaddingRight()) { childViewList.add(lineViews); lineViews = new ArrayList<View>(); if (i == 0 ) { lineHeight = getPaddingTop() ; }else if (i== childCount - 1) { lineHeight = getPaddingBottom() ; } this.lineHeight.add(lineHeight); lineHeight = 0 ; lineWidth = 0 ; } lineWidth = childWidth; lineHeight = Math.max(lineHeight, childHeight) ; lineViews.add(childView); } childViewList.add(lineViews); this.lineHeight.add(lineHeight); int left = getPaddingLeft() ; int top = getPaddingTop(); for (int i = 0; i < childViewList.size(); i) { lineViews = childViewList.get(i); for (int j = 0; j < lineViews.size(); j) { View childView = lineViews.get(j); MarginLayoutParams params = (MarginLayoutParams) childView.getLayoutParams(); int lc = left params.leftMargin ; int tc = top params.topMargin ; int rc = lc childView.getMeasuredWidth() ; int bc = tc childView.getMeasuredHeight() ; childView.layout(lc,tc,rc,bc); left = params.leftMargin childView.getMeasuredWidth() params.rightMargin ; } left = getPaddingLeft() ; top = this.lineHeight.get(i) ; } }代码下载地址: 百度网盘:版权声明:本文为博主原创文章,未经博主允许不得转载。
WebView控件应用——模仿URL有道词典 一、项目开发1、开发介绍本项目是用WebView控件模仿网上有道词典,WebSettings中有很多关于WebView的设置,这里列出几个常用的方法:1)、//得到WebSettings
android开发步步为营之:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题 最近项目里面有个需求,一个页面放了一个ScrollView,整个页面可以向上滚动,然后ScrollView里面又嵌套了一个ListView,ListView里面的数据也是可以上下滑
Android开源SlidingMenu的使用 SlidingMenu是Android上的一个侧滑菜单,如下图所示:今天主要记录的是SlidingMenu的使用,我们可以从Github上下载该开源项目,下载地址是:
友情链接: 武汉网站建设