美文网首页Android知识Android开发Android技术知识
Android布局“小众派”——PercentFrameLayo

Android布局“小众派”——PercentFrameLayo

作者: brucevanfdm | 来源:发表于2016-12-12 15:41 被阅读1889次

前言

Google为开发者提供了多种布局方案,以应对复杂的用户界面,简化了开发者的工作。那么除了常用的布局之外,还有哪些比较“小众”的布局呢?今天我们来回顾一下常用布局,认识PercentFrameLayout&PercentRelativeLayout

Android常用布局

  • LinearLayout 线性布局
  • RelativeLayout 相对布局
  • FrameLayout 帧布局

LinearLayout & RelativeLayout回顾

LinearLayout 的小技巧:
  1. 利用LinearLayout自带属性为其子View添加分割线:
android:divider="@drawable/divider"
android:showDividers="beginning|middle|end">

divider.xml内容如下:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/colorAccent" />
    <size android:height="0.5dp" />
</shape>
  1. layout_weight属性
    在使用weight属性时,把对应方向上的height/width指定为0dp(具体看LinearLayout的方向);需要将子View填满剩余布局时,指定该View的 layout_weight属性为1即可。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <TextView
        android:layout_width="60dp"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="附件" />
    <EditText
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1" />
    <TextView
        android:layout_width="60dp"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="发送" />
</LinearLayout>
RelativeLayout&LinearLayout 性能对比?

1.RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子View2次onMeasure
2.RelativeLayout的子View如果高度和RelativeLayout不同,则会引发效率问题,当子View很复杂时,这个问题会更加严重。如果可以,尽量使用padding代替margin。
3.在不影响层级深度的情况下,使用LinearLayout和FrameLayout而不是RelativeLayout。
详情见:Android中RelativeLayout和LinearLayout性能分析

今日主菜:

Android布局“小众派”——PercentFrameLayout

有了这个布局,我们就可以轻易的实现任意比例分割的布局了,但是为什么说是小众派呢,一是因为因为LinearLayout的替代性,二是这个布局是在support library下的,需要单独引入使用:
compile 'com.android.support:percent:25.0.1'
正如名字,它是FrameLayout的子类,也就是说它具有了FrameLayout的属性。

percentFrameLayout.png

PercentFrameLayout用法:

<android.support.percent.PercentFrameLayout
         xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto"
         android:layout_width="match_parent"
         android:layout_height="match_parent">

     <ImageView
         app:layout_widthPercent="50%"
         app:layout_heightPercent="50%"
         app:layout_marginTopPercent="25%"
         app:layout_marginLeftPercent="25%"/>

 </android.support.percent.PercentFrameLayout>

这里一定要定义app命名空间,用来引用PercentFrameLayout的属性

其他属性:

  app:layout_marginRightPercent
  app:layout_marginBottomPercent
  app:layout_marginStartPercent
  app:layout_marginEndPercent
  app:layout_aspectRatio

细心的同学可能发现了,上面的ImageView没有定义宽高啊!?是的,在这里并不需要,但是,可以在某些占百分比比价笑小的空间中加入layout_width/height="wrap_content,防止太小的百分比致使该控件无法正常显示,保证能显示出内容。

app:layout_aspectRatio 这个属性有点陌生,其实它是屏幕的宽高比,如:

     android:layout_width="300dp"
     app:layout_aspectRatio="200%"

PercentFrameLayout.xml实例

<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:background="@android:color/holo_green_light"
        app:layout_heightPercent="45%"
        app:layout_widthPercent="100%" />

    <Button
        android:layout_gravity="center"
        android:background="@android:color/darker_gray"
        app:layout_heightPercent="10%"
        app:layout_widthPercent="100%" />

    <Button
        android:layout_gravity="bottom|left"
        android:background="@android:color/holo_blue_dark"
        app:layout_heightPercent="45%"
        app:layout_widthPercent="50%" />

    <Button
        android:layout_gravity="bottom|right"
        android:background="@android:color/holo_blue_bright"
        app:layout_heightPercent="45%"
        app:layout_marginLeftPercent="30%"
        app:layout_widthPercent="50%" />

</android.support.percent.PercentFrameLayout>

布局效果

可以看到我们用PercentFrameLayout轻松实现了这个布局,大家可以想想用其他布局怎么实现。笔者认为它相对于LinearLayout减少了层级,相对于RelativeLayout则简单了很多,不失为一种优雅的写法。

PercentFrameLayout实例

Android布局“小众派”——PercentRelativeLayout

PercentRelativeLayout则是RelativeLayout的子类,继承了它的所有属性,并且扩展了百分比属性,跟前文介绍的PercentFrameLayout百分比属性以及宽高比属性一样。这里就不做过多介绍了。

相关文章

网友评论

    本文标题:Android布局“小众派”——PercentFrameLayo

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