文档章节

Android自定义百分比布局

天使broken
 天使broken
发布于 2016/09/20 14:59
字数 561
阅读 57
收藏 1

 1  首先做一个定义的View 继承RelativeLayout (举例用RelativeLayout 当然你可以用线性布局都无所谓)。

    然后重写一下3个方法。下一步做过自定义属性动画的同学都应该知道。我们应该重写onMeasure()方法。在这个方法里面 我们会做几个事情:1 获取到屏幕的宽高。2 拿到控件的宽高。然后进行改变。下面是代码。
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // 测量高度
        int width = View.MeasureSpec.getSize(widthMeasureSpec);
        int height = View.MeasureSpec.getSize(heightMeasureSpec);
        // 测量自控件的宽高 然后进行改变
        int childCount = getChildCount();// 获取到下面的所有子控件
        for (int i = 0; i < childCount; i++) {
            View view = getChildAt(i);
            float widthpercent = 0;
            float heightpercent = 0;
            ViewGroup.LayoutParams Params = view.getLayoutParams();
            if (Params instanceof PercentLayout.LayoutParams) {
                widthpercent = ((PercentLayout.LayoutParams) Params)
                        .getWidthPercent();
                heightpercent = ((PercentLayout.LayoutParams) Params)
                        .getHeightPercent();
            }

            if (widthpercent != 0) {
                Params.width = (int) (width * widthpercent);
                Params.height = (int) (height * heightpercent);
            }
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

2 但是做完上面的还是不够的。我们还需要复写generateLayoutParams()

    @Override
    public android.widget.RelativeLayout.LayoutParams generateLayoutParams(
            AttributeSet attrs) {
        return new LayoutParams(getContext(), attrs);
    }

3  现在我们来写LayoutParams这个内部类

class LayoutParams extends RelativeLayout.LayoutParams {
        private float widthPercent;
        private float heightPercent;

        public LayoutParams(Context context, AttributeSet attributeSet) {
            super(context, attributeSet);
            TypedArray array = context.obtainStyledAttributes(attributeSet,
                    R.styleable.percentlayout);
            heightPercent = array.getFloat(
                    R.styleable.percentlayout_layout_heightpercent,
                    heightPercent);
            widthPercent = array
                    .getFloat(R.styleable.percentlayout_layout_widthpercent,
                            widthPercent);
            array.recycle();// 释放掉
        }

注意的是我们在这里继承的是这个RelativeLayout。如果你用LinLayout的也可以的 但是我们要和这个自定义的保持一致。我们做的是一个自定义RelativeLayout 的百分比布局。然后是把里面的方法都复写一次。

4 然后是布局文件。我自定义了一个attr文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable  name="percentlayout">
        <attr  name="layout_widthpercent"   format="float">0</attr>
        <attr  name="layout_heightpercent"  format="float">0</attr>
    </declare-styleable>
    </resources>
5  看activity_main.xml布局

<?xml version="1.0" encoding="utf-8"?>
<com.example.percentlayout.PercentLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.example.percentlayout"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
<Button
    android:text="Nice"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    app:layout_widthpercent="0.6"
    android:layout_marginLeft="20px"
    app:layout_heightpercent="0.8"
    android:background="@android:color/holo_orange_dark"
    />
</com.example.percentlayout.PercentLayout>

注意地方是那个app 这个属性是没有的。是我们在头文件里面申明的当然 你也可以改成其他的

xmlns:app="http://schemas.android.com/apk/res/com.example.percentlayout"

 

 

© 著作权归作者所有

天使broken
粉丝 18
博文 35
码字总数 16482
作品 0
徐汇
Android工程师
私信 提问
Android自实现百分比布局

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/mynameishuangshuai/article/details/52790465 在开发中,组件布局是...

猴子搬来的救兵Castiel
2016/10/11
0
0
android 常用第三方插件收藏

1、android-vertical-slide-view : 仿照淘宝和聚美优品,在商品详情页,向上拖动时,可以加载下一页。使用ViewDragHelper,滑动比较流畅。 2、Android-MaterialRefreshLayout :这是一个下拉...

ch10mmt
2018/06/26
0
0
Android 增强版百分比布局库 为了适配而扩展

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lmj623565791/article/details/46767825 转载请标明出处: http://blog.csdn.net/lmj623565791/article/deta...

鸿洋_
2015/07/06
0
0
Android5.0+(Percent 百分比布局)

相信大家都已经对Android API所提供的布局方式非常熟悉了。也许在接触Android的时候都有过这样的想法,如果可以按照百分比的方式进行界面布局,这样适配各种屏幕就简单多了吧!谷歌正式提供百...

让代码飞一会
2015/07/27
499
1
Android8.1 SystemUI源码分析之 电池时钟刷新

SystemUI源码分析相关文章 Android8.1 SystemUI源码分析之 Notification流程 分析之前再贴一下 StatusBar 相关类图 电池图标刷新 从上篇的分析得到电池图标对应的布局为 SystemUIsrccomandr...

cczheng
06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部