美文网首页
Android轻松搞定流动布局(FlexboxLayout)

Android轻松搞定流动布局(FlexboxLayout)

作者: 程思扬 | 来源:发表于2018-06-02 10:25 被阅读0次

以前我们要实现流动性布局,比较繁琐,Google开源了一个项目叫FlexboxLayout,相信大家都不陌生。下面我们来学习一下FlexboxLayout基础知识,并通过一个案例来加深理解。如果你对FlexboxLayout很熟悉,请忽略本文。

1. 什么是 Flexbox

简单来说 Flexbox 是属于web前端领域CSS的一种布局方案,是2009年W3C提出了一种新的布局方案,可以响应式地实现各种页面布局,并且 React Native 也是使用的 Flex 布局。

我们可以简单的理解为 Flexbox 是CSS领域类似 Linearlayout 的一种布局,但比 Linearlayout 要强大的多。

2. 什么是 FlexboxLayout?

我们在 Android 开发中使用 Linearlayout + RelativeLayout 基本可以实现大部分复杂的布局,但是Google就想了,有没有类似 Flexbox 的一个布局呢?这使用起来一个布局就可以搞定各种复杂的情况了,于是 FlexboxLayout 就应运而生了。

所以 FlexboxLayout 是针对 Android 平台的,实现类似 Flexbox 布局方案的一个开源项目,开源地址:https://github.com/google/flexbox-layout

3. 使用方式

使用方式很简单,只需要添加以下依赖:

compile'com.google.android:flexbox:0.2.2'

在xml布局中我们可以这样使用

代码中可以这样使用

FlexboxLayout flexboxLayout = (FlexboxLayout) findViewById(R.id.flexbox_layout);

flexboxLayout.setFlexDirection(FlexboxLayout.FLEX_DIRECTION_COLUMN);

View view = flexboxLayout.getChildAt(0);

FlexboxLayout.LayoutParams lp = (FlexboxLayout.LayoutParams) view.getLayoutParams();

lp.order = -1;

lp.flexGrow = 2;

view.setLayoutParams(lp);

我们来看简书平台热门专题的布局

下面我们来实现它,先来看最终实现的效果:

1. 新建activity_flow.xml布局

布局很简单,只有一个FlexboxLayout 因为我们需要动态创建它的item,所以就在这里固定写TextView了

2. 新建ActivityFlow Activity,填充数据源

String[] tags = {"婚姻育儿","散文","设计","上班这点事儿","影视天堂","大学生活","美人说","运动和健身","工具癖","生活家","程序员","想法","短篇小说","美食","教育","心理","奇思妙想","美食","摄影"};        flexboxLayout = (FlexboxLayout) findViewById(R.id.flexbox_layout);for(inti =0; i < tags.length; i++) {            Book model =newBook();            model.setId(i);            model.setName(tags[i]);            flexboxLayout.addView(createNewFlexItemTextView(model));        }

其中Book为一个实体,这个不是关键,关键的是createNewFlexItemTextView方法

我们要动态加载FlexboxLayout其FlexItem 并且让FlexboxLayout中的item支持点击事件,因为我们需要知道用户点击了哪个专题跳转。

我们来看一下createNewFlexItemTextView方法

/**    * 动态创建TextView    *@parambook    *@return*/privateTextViewcreateNewFlexItemTextView(finalBook book){        TextView textView =newTextView(this);        textView.setGravity(Gravity.CENTER);        textView.setText(book.getName());        textView.setTextSize(12);        textView.setTextColor(getResources().getColor(R.color.colorAccent));        textView.setBackgroundResource(R.drawable.tag_states);        textView.setTag(book.getId());        textView.setOnClickListener(newView.OnClickListener() {@OverridepublicvoidonClick(View view){                Log.e(TAG, book.getName());            }        });intpadding = Util.dpToPixel(this,4);intpaddingLeftAndRight = Util.dpToPixel(this,8);        ViewCompat.setPaddingRelative(textView, paddingLeftAndRight, padding, paddingLeftAndRight, padding);        FlexboxLayout.LayoutParams layoutParams =newFlexboxLayout.LayoutParams(                ViewGroup.LayoutParams.WRAP_CONTENT,                ViewGroup.LayoutParams.WRAP_CONTENT);intmargin = Util.dpToPixel(this,6);intmarginTop = Util.dpToPixel(this,16);        layoutParams.setMargins(margin, marginTop, margin,0);        textView.setLayoutParams(layoutParams);returntextView;    }

其他有关Book实体和Util类,也贴出来一下

Book实体

publicclassBook{privateintid;privateString name;publicStringgetName(){returnname;    }publicvoidsetName(String name){this.name = name;    }publicintgetId(){returnid;    }publicvoidsetId(intid){this.id = id;    }publicBook(){    }}

Util工具类

publicclassUtil{publicstaticintpixelToDp(Context context,intpixel){        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();returnpixel <0? pixel : Math.round(pixel / displayMetrics.density);    }publicstaticintdpToPixel(Context context,intdp){        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();returndp <0? dp : Math.round(dp * displayMetrics.density);    }}

这样关于流动布局[FlexboxLayout],我们就实现完成了,是不是很简单。

相关文章

网友评论

      本文标题:Android轻松搞定流动布局(FlexboxLayout)

      本文链接:https://www.haomeiwen.com/subject/gkzlsftx.html