之前写过一篇屏幕适配的文章Android 屏幕适配最佳实践,里面提到了类似百分比布局的东西,可是该方法缺点非常明显,就会添加非常多没用的数据,导致apk包变大。

而谷歌的support库中,添加了一个叫做percent库。该库在如图文件夹下,假设没有,请使用sdk manager更新至最新

在使用前,我们先看下这个库有哪些类

非常明显里面有一个FrameLayout布局的子类和RelativeLayout布局的子类。此外另一个Helper类。这个Helper类主要是完毕百分比的測量工作。里面有一个接口PercentLayoutParams,假设我们自己要实现百分比布局,那么就要实现这个接口。

我们看下谷歌对外发布了什么自己定义属性

<?xml version="1.0" encoding="utf-8"?

>
<resources>
<declare-styleable name="PercentLayout_Layout">
<attr name="layout_widthPercent" format="fraction"/>
<attr name="layout_heightPercent" format="fraction"/>
<attr name="layout_marginPercent" format="fraction"/>
<attr name="layout_marginLeftPercent" format="fraction"/>
<attr name="layout_marginTopPercent" format="fraction"/>
<attr name="layout_marginRightPercent" format="fraction"/>
<attr name="layout_marginBottomPercent" format="fraction"/>
<attr name="layout_marginStartPercent" format="fraction"/>
<attr name="layout_marginEndPercent" format="fraction"/>
</declare-styleable>
</resources>

看到这些属性应该能直接明确这些属性的意思,其属性值类型为fraction。即小数,百分比。主要属性有宽度,高度占是百分比,外边距的百分比,当中Android MarginLeft与MarginStart的差别參考Android MarginLeft与MarginStart的差别。提取关键内容例如以下。

在写layout布局的时候,我们会发现有这样几个比較类似的属性:

MarginStart MarginLeft

MarginEnd MarginRight

这些属性的差别是什么? 依据api凝视,我们得知MarginStart指的是控件距离开头View部分的间距大小。MarginLeft则指的是控件距离左边View部分的间距大小,MarginEnd和MarginRight同理。

普通情况下,View開始部分就是左边,可是有的语言眼下为止还是依照从右往左的顺序来书写的,比如阿拉伯语。在Android 4.2系统之后,Google在Android中引入了RTL布局,更好了支持了由右到左文字布局的显示,为了更好的兼容RTL布局,google推荐使用MarginStart和MarginEnd来替代MarginLeft和MarginRight,这样应用能够在正常的屏幕和由右到左显示文字的屏幕上都保持一致的用户体验。

了解了这些后,我们開始使用PercentRelativeLayout

使用前添加库文件依赖

    compile 'com.android.support:percent:22.2.0'

開始编写布局文件。我们要实现的效果如图所看到的

即左边红色部分宽度占屏幕30%,高度占屏幕90%,右边宽度占屏幕70%。高度各占屏幕45%。

在不使用百分比布局之前。我们通常是使用LinearLayout的weight达到这样的效果,然而使用weight会添加布局的嵌套。会过度绘制。那么使用百分比布局会变成什么样的,无需布局嵌套,设置高度宽度百分比就可以。

<android.support.percent.PercentRelativeLayout
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" > <View
android:id="@+id/left"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_alignParentBottom="true"
android:background="#ff0000"
app:layout_heightPercent="100%"
app:layout_marginBottomPercent="10%"
app:layout_widthPercent="30%"/>
<View
android:id="@+id/right_top"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_alignParentRight="true"
android:background="#00ff00"
app:layout_heightPercent="45%"
app:layout_widthPercent="70%"/>
<View
android:id="@+id/right_bttom"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:background="#ffff00"
app:layout_heightPercent="45%"
app:layout_marginBottomPercent="10%"
app:layout_widthPercent="70%"/>
</android.support.percent.PercentRelativeLayout>

我们要设置左边的布局宽度占30%,使用app:layout_widthPercent=”30%”,高度占90%,为了演示另一个属性的使用,这里不直接设置高度为90%,而是设置高度为100%,底边距为10%,即

android:layout_alignParentBottom="true"
app:layout_heightPercent="100%"
app:layout_marginBottomPercent="10%"

同理编写右边两个的布局。

正如文章开头看到的,这个库仅仅提供了两个百分比布局给我们使用,比較常见的线性布局并没有提供相应的百分比布局。

因此。我们想能不能自己实现一个呢,答案是肯定的。通过观察现有的两个百分比布局的代码。我们需呀继承原来的布局。即LinearLayout。编写相应的构造方法调用父类。声明一个PercentLayoutHelper对象辅助完毕百分比測量。此外还须要重写onMeasure和onLayout方法,以及一个

实现了PercentLayoutHelper.PercentLayoutParams接口的继承原来布局的LayoutParams的LayoutParams。

那么我们新建一个叫PercentLinearLayout的继承LinearLayout的类,实现其构造方法。以及声明一个final的PercentLayoutHelper 对象。


public class PercentLinearLayout extends LinearLayout {
private final PercentLayoutHelper mHelper = new PercentLayoutHelper(this); public PercentLinearLayout(Context context) {
super(context);
} public PercentLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
} public PercentLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}

仿造现有的两个百分比布局实现内部类LayoutParams ,这一步直接复制代码改动一下就可以,记得一定要继承自android.widget.LinearLayout.LayoutParams。

   public static class LayoutParams extends android.widget.LinearLayout.LayoutParams implements PercentLayoutHelper.PercentLayoutParams {
private PercentLayoutHelper.PercentLayoutInfo mPercentLayoutInfo; public LayoutParams(Context c, AttributeSet attrs) {
super(c, attrs);
this.mPercentLayoutInfo = PercentLayoutHelper.getPercentLayoutInfo(c, attrs);
} public LayoutParams(int width, int height) {
super(width, height);
} public LayoutParams(android.view.ViewGroup.LayoutParams source) {
super(source);
} public LayoutParams(MarginLayoutParams source) {
super(source);
} public PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo() {
return this.mPercentLayoutInfo;
} protected void setBaseAttributes(TypedArray a, int widthAttr, int heightAttr) {
PercentLayoutHelper.fetchWidthAndHeight(this, a, widthAttr, heightAttr);
}
}

此外,还要重写一个生成LayoutParams 的方法generateLayoutParams,返回我们的内部类。

    @Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new PercentLinearLayout.LayoutParams(this.getContext(), attrs);
}

然后又一次onLayout和onMeasure方法就可以,这一步也不须要自己实现,直接复制代码就可以。

   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
this.mHelper.adjustChildren(widthMeasureSpec, heightMeasureSpec);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(this.mHelper.handleMeasuredStateTooSmall()) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} } protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
this.mHelper.restoreOriginalParams();
}

就这样,完毕了百分比线性布局,我们进行使用下。完毕以下的效果,任意发挥的涂鸦。

主要是红色部分,从上到下,高度各为父容器的20%,30%,30%。宽度各为父容器的30%,50%,40。当中第三个靠右边布局,右边距为父容器的20%。同一时候有上边距为父容器的10%,看代码更直接

<android.support.percent.PercentRelativeLayout
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"> <View
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#00ff00"
app:layout_heightPercent="30%"
app:layout_widthPercent="50%"></View> <cn.edu.zafu.percentlayout.PercentLinearLayout
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_heightPercent="50%"
app:layout_widthPercent="100%"
android:background="#ff0000"
android:layout_alignParentBottom="true"
app:layout_marginBottomPercent="10%"
android:orientation="vertical"
> <View
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#ff0ff0"
app:layout_heightPercent="20%"
app:layout_widthPercent="30%"/>
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#dedff0"
app:layout_heightPercent="30%"
app:layout_widthPercent="50%"
app:layout_marginTopPercent="10%"
app:layout_marginLeftPercent="10%"
/>
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#1254f0"
android:layout_gravity="right"
app:layout_heightPercent="30%"
app:layout_widthPercent="40%"
app:layout_marginTopPercent="10%"
app:layout_marginRightPercent="20%"
/>
</cn.edu.zafu.percentlayout.PercentLinearLayout> </android.support.percent.PercentRelativeLayout>

怎么样,是不是轻轻松松就实现了百分比布局,很多其它内容自行挖掘,以下上源代码

http://download.csdn.net/detail/sbsujjbcy/8853673

eclipse可用的库请见下载链接,将该项目导入eclipse中去,依赖该项目就可以使用百分比布局.

http://download.csdn.net/detail/sbsujjbcy/8857747

Android Support库百分比布局的更多相关文章

  1. (转)Android Support Percent百分比布局

    一.概述 周末游戏打得过猛,于是周天熬夜码代码,周一早上浑浑噩噩的发现 android-percent-support-lib-sample(https://github.com/JulienGeno ...

  2. Android Support库——support annotations

    Android Support库是官方出的支持扩展库,包含了丰富的组件.工具类等,通过在Android SDK Manager中勾选以下两项来获取到. 其中,Android Support Libra ...

  3. Android 增强版百分比布局库 为了适配而扩展

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46767825: 本文出自:[张鸿洋的博客] 一 概述 上周一我们发布了Andr ...

  4. 屏幕适配1(Android 增强版百分比布局库 为了适配而扩展)

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46767825: 本文出自:[张鸿洋的博客] 这篇博文写得太好了,让我很激动,分 ...

  5. android.support.v7.app.AppCompatActivity不能使用的解决办法

    最近Android Studio 更新到4.0版本后,在构建项目时使用 android.support.v7.XX android.support.v4.XX 发现在xml文件中,原先我最常使用的Dr ...

  6. Android百分比布局支持库介绍——com.android.support:percent(转)

    转载自http://www.apkbus.com/forum.php?mod=viewthread&tid=244752&extra=&_dsign=0b699c42 在此之前 ...

  7. Android添加百分比布局库时显示Failed to resolve: com.android.support.percent:问题

    这是看第一行代码中遇到的问题,要添加百分比布局库的依赖时要在app下的bulid.gradle添加以下代码 implementation fileTree(dir:'libs',include:['* ...

  8. Android 屏幕适配(二)增强版百分比布局库(percent-support-lib)

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46767825: 本文出自:[张鸿洋的博客] 一 概述 上周一我们发布了Andr ...

  9. Android 屏幕适配(一)百分比布局库(percent-support-lib) 解析与扩展

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46695347: 本文出自:[张鸿洋的博客] 一.概述 周末游戏打得过猛,于是周 ...

随机推荐

  1. 淘宝内部大量使用的开源系统监控工具--Tsar

    Tsar是淘宝开发的一个非常好用的系统监控工具,在淘宝内部大量使用    它不仅可以监控CPU.IO.内存.TCP等系统状态,也可以监控Apache,Nginx/Tengine,Squid等服务器状态 ...

  2. 如何判断手机收有几张SIM卡

    //判断卡槽1中是不是有卡 boolean hasIccCard1 = MSimTelephonyManager.getDefault().hasIccCard(0); //判断卡槽2中是不是有卡 b ...

  3. c# winform InvokeRequired 解决跨线程访问控件

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它. Windows 窗体中 ...

  4. linux下查阅文件内容cat,more,less,tail

    1.常用cat,直接查看,一次性全部输出 cat  filename cat -b filename 显示行号,除空白行   cat -n 显示行号,包括空白行 常用:cat  filename | ...

  5. C# winCE5.0开发右键效果解决方案

    用VS2008开发C#语言wince程序,发现程序里右键捕获不到,采集器上点也没反应,上网查好像有个c++版本的,看不懂啊,下面我给出C#实现右键效果的解决方案,请各位多多优化. 首先控件Contex ...

  6. 安装Node.js

    1.window下安装Node.js 安装git,方便使用命令行. 网址:http://www.git-scm.com/download/ 下载后直接安装即可 接着安装Node.js https:// ...

  7. (转)弹出窗口lhgDialog API文档

    应用到你的项目 如果您使用独立版本的lhgDialog窗口组件,您只需在页面head中引入lhgcore.lhgdialog.min.js文件,4.1.1+版本做了修改可以和jQuerya库同时引用, ...

  8. Swift缩水版MJExtension - Reflect的基本使用

    github:https://github.com/CharlinFeng/Reflect 直接拖拽Reflect文件夹到您的项目中即可,无任何第三方依赖!文件夹结构说明:.Coding 归档相关.R ...

  9. 兄弟选择器 E + F

    兄弟选择器在IE7下支持会有bug,特记于此 如果兄弟选择器有Html注释,兄弟选择器在IE7下会失效  代码如下 E + Fp + p{color:red} <p class="te ...

  10. PHP+MySQL Smarty简单分页显示示例

    一.分页程序的原理 分页程序有两个非常重要的参数:每页显示几条记录($pagesize)和当前是第几页($page). 有了这两个参数就可以很方便的写出分页程序,我们以MySql数据库作为数据源,在m ...