自定义ViewGroup

Android中自定义ViewGroup 三、一个小Demo我们新建一个叫AndroidViewGroup的工程,Activity起名为MainActivity。在写一个继承于ViewGroup的类,名叫HelloViewGroup。–>HelloViewGroup类@Override–>MainActivity类这时你可以运行一下,发现屏幕除了状态栏了那个Label是一片黑,呵呵。下面我们来修改代码,让自己的ViewGroup火起来。我们新建一个名叫myAddView的方法,这个方法用来向ViewGroup中添加组件: 阅读详情

引子:标准的自定义ViewGroup应该包含什么

github

第一部分

  1. 支持wrap_content

    即当ViewGroup的宽、高使用wrap-content时,ViewGroup的高宽根据子View的实际大小来确定

    如果你不处理的话,“wrap-content”的和 “match-parent”是一样的

  2. ViewGroup支持Padding

  3. 其子View支持margin

  4. 支持自定义属性

    例如:gravity

第二部分

  1. 支持滚动效果(当然,是你有滚动的需求的话)

第三部分

  1. 滑动事件冲突处理

    touch事件分发

接下来,我们一步一步实现以上内容

第一步、自己来写一个横向的LinearLayout(先实现支持wrap_content和padding)

必须要掌握的内容

  1. onMeasure的写法

  2. onLayout的写法

难点

  1. onMeasure中widthMeasureSpec、heightMeasureSpec的理解

    这里不具体解释这个问题,只需知道,就是因为MeasureSpec的规则导致了,如果你不进行特殊处理,致使wrap-content的效果为match-parent

    展开说一句:儿子的尺寸,不完全由儿子自己决定,与父亲传递过来的测量规格是有关系的

  2. onLayout中l,t,r,b的含义

    解释一下:int l, int t, int r, int b,这四个值

这四个值,就是通过onMeasure方法测量后,得到的这个MyViewGroup的左上右下值
注意:l,t,r,b是考虑了其所在的父ViewGroup的padding值的(MyviewGroup自身的padding值,当然也考虑进去了)
这四个值,大家可以打印出来看看就明白了,这个不清楚的话,很难写好onLayout方法
l=自定义ViewGroup的父ViewGroup的leftPadding
t=自定义ViewGroup的父ViewGroup的topPadding

r=自定义ViewGroup的父ViewGroup的leftPadding+这个MyViewGroup的宽度(即上文的desireWidth)

t=自定义ViewGroup的父ViewGroup的topPadding+这个MyViewGroup的高度(即上文的desireHeight)

开始

大家都知道,自定义View要经过onMeasure、onLayout、onDraw三个流程

onMeasure里要完成的内容(再次强调这里说的是自定义ViewGroup,自定义View不是本文讨论的范畴)
  1. 要测量其内部所有的子View的宽高
measureChild(View child, int parentWidthMeasureSpec,
            int parentHeightMeasureSpec)
 measure(int widthMeasureSpec, int heightMeasureSpec)
上面两个方法都可以使用,意思是一样的

 第一个是,测量每一个子View的方法
 第二个是,让每一个子View去测量自己的方法
  1. 测量ViewGroup自己的宽高

    • 你要是懒得支持wrap_content,只需要写

      super.onMeasure(widthMeasureSpec,heightMeasureSpec);即可,

      会调用父类的流程去测量你自定义的ViewGroup的宽高(不具体展开源码,源码其实调用的是setMeasuredDimension(int measuredWidth, int measuredHeight))

      不支持wrap-content的意思就说:当你设置宽高为wrap-content时候,实际的效果却是match_content

    • 你要是支持wrap_content的话,
      使用下面的方法来测量ViewGroup自身的宽高

setMeasuredDimension(resolveSize(desireWidth, widthMeasureSpec),
                resolveSize(desireHeight, heightMeasureSpec));
    >你肯定想当你的ViewGroup宽度为wrap-content时,这个ViewGroup的宽度值是所有子View的宽度之和再加上左右padding(先不考虑子View的margin),
    >
    >这就需要你在测量每一个子View的宽度时,累加所有的子View宽度再加上左右padding值作为ViewGroup的宽度(当ViewGroup的宽度值你设置的是wrap_content时,你要是设100dp,那就直接是100dp了),
    >
    >由于本例是横向排列的ViewGroup,所以,ViewGroup的高度就是子View里最高的那个子View的高度再加上上下padding了
    >
    >代码里的:
    >
    >desireWidth=所有子View的宽度累加之和+左右padding
    >
    >desireHeight=最高的那个子View的高度+上下padding
  1. onMeasure模板代码:(只是支持wrap_content和padding,还不支持margin)
@Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

            // ★1. 计算所有child view 要占用的空间
            desireWidth = 0;//累加所有子View的宽度,作为MyViewGroup宽度设为wrap_content时的宽度
            desireHeight = 0;//本例子是横向排列的ViewGroup,所以,MyViewGroup高度设为wrap_content时,其高度是其所有子View中最高子View的高度
            int count = getChildCount();
            for (int i = 0; i < count; ++i) {
                View v = getChildAt(i);

                //1.1 开始遍历测量所有的子View,并且根据实际情况累加子View的宽(或者高),为了计算整个viewgroup的宽度(高度)
                if (v.getVisibility() != View.GONE) {//不去测量Gone的子View
                    measureChild(v, widthMeasureSpec,
                            heightMeasureSpec);

                    --------------只需要根据你的需求,更改虚线内部的代码即可,其余的不用改--------------
                    //由于横向排列,累加所有的子View的宽度
                    desireWidth += v.getMeasuredWidth();
                    //高度是子View中最高的高度
                    desireHeight = Math
                            .max(desireHeight, v.getMeasuredHeight());
                    --------------只需要根据你的需求,更改虚线内部的代码即可,其余的不用改--------------

                }
            }

            // 1.2 考虑padding值
            //到目前为止desireWidth为所有子View的宽度的累加,作为MyViewGroup的总宽度,要加上左右padding值
            desireWidth += getPaddingLeft() + getPaddingRight();
            //高度同理略
            desireHeight += getPaddingTop() + getPaddingBottom();


            //★2.测量ViewGroup的宽高,如果不写这一步,使用wrap_content时效果为match_parent的效果
            // (下面的写法比较简洁,《Android群英传》介绍了另外一种写法,比这个稍微麻烦一点)
            // see if the size is big enough
            desireWidth = Math.max(desireWidth, getSuggestedMinimumWidth());
            desireHeight = Math.max(desireHeight, getSuggestedMinimumHeight());
            // super.onMeasure(widthMeasureSpec,heightMeasureSpec);
            setMeasuredDimension(resolveSize(desireWidth, widthMeasureSpec),
                    resolveSize(desireHeight, heightMeasureSpec));
        }
onLayout要实现的内容
@Override
            protected void onLayout(boolean changed, int l, int t, int r, int b) {

                //这个自定义的ViewGroup的有效内容的四个边界
                final int parentLeft = getPaddingLeft();//这个MyViewGroup的最左边的距离(纯粹的内容的左边界,不含padding)
                final int parentTop = getPaddingTop();//这个MyViewGroup的最上边的距离(纯粹的内容的上边界,不含padding)
                final int parentRight = r - l - getPaddingRight();//这个MyViewGroup的最右边的距离(纯粹的内容的右边界,不含padding)

                final int parentBottom = b - t - getPaddingBottom();//这个MyViewGroup的最下边的距离(纯粹的内容的下边界,不含padding)

                if (BuildConfig.DEBUG)
                    Log.d("onlayout", "parentleft: " + parentLeft + "   parenttop: "
                            + parentTop + "   parentright: " + parentRight
                            + "   parentbottom: " + parentBottom+"\n"+ "   l: " + l+ "   t: " + t+ "   r: " + r+ "   b: " + b);

                int left = parentLeft;
                int top = parentTop;

                int count = getChildCount();
                for (int i = 0; i < count; i++) {
                    View v = getChildAt(i);
                    if (v.getVisibility() != View.GONE) {
                        //得到每一个子View的测量后的宽高
                        final int childWidth = v.getMeasuredWidth();
                        final int childHeight = v.getMeasuredHeight();
                        //开始布局每一个子View(左、上、右=左+子View宽、下=上+子View高)
                        v.layout(left, top, left + childWidth, top + childHeight);
                        //由于本例是横向排列的,所以每一个子View的left值要递增
                        left += childWidth;
                    }
                }
    }

完整代码:

public class MyViewGroup extends ViewGroup {

        private int desireWidth;
        private int desireHeight;

        public MyViewGroup(Context context) {
            this(context, null);
        }

        public MyViewGroup(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

            // ★1. 计算所有child view 要占用的空间
            desireWidth = 0;//累加所有子View的宽度,作为MyViewGroup宽度设为wrap_content时的宽度
            desireHeight = 0;//本例子是横向排列的ViewGroup,所以,MyViewGroup高度设为wrap_content时,其高度是其所有子View中最高子View的高度
            int count = getChildCount();
            for (int i = 0; i < count; ++i) {
                View v = getChildAt(i);

                //1.1 开始遍历测量所有的子View,并且根据实际情况累加子View的宽(或者高),为了计算整个viewgroup的宽度(高度)
                if (v.getVisibility() != View.GONE) {//不去测量Gone的子View
                    measureChild(v, widthMeasureSpec,
                            heightMeasureSpec);
                    //由于横向排列,累加所有的子View的宽度
                    desireWidth += v.getMeasuredWidth();
                    //高度是子View中最高的高度
                    desireHeight = Math
                            .max(desireHeight, v.getMeasuredHeight());
                }
            }

            // 1.2 考虑padding值
            //到目前为止desireWidth为所有子View的宽度的累加,作为MyViewGroup的总宽度,要加上左右padding值
            desireWidth += getPaddingLeft() + getPaddingRight();
            //高度同理略
            desireHeight += getPaddingTop() + getPaddingBottom();


            //★2.测量ViewGroup的宽高,如果不写这一步,使用wrap_content时效果为match_parent的效果
            // (下面的写法比较简洁,《Android群英传》介绍了另外一种写法,比这个稍微麻烦一点)
            // see if the size is big enough
            desireWidth = Math.max(desireWidth, getSuggestedMinimumWidth());
            desireHeight = Math.max(desireHeight, getSuggestedMinimumHeight());
            //super.onMeasure(widthMeasureSpec,heightMeasureSpec);
            setMeasuredDimension(resolveSize(desireWidth, widthMeasureSpec),
                    resolveSize(desireHeight, heightMeasureSpec));
        }

        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {


            //这个自定义的ViewGroup的有效内容的四个边界
            final int parentLeft = getPaddingLeft();//这个MyViewGroup的最左边的距离(纯粹的内容的左边界,不含padding)
            final int parentTop = getPaddingTop();//这个MyViewGroup的最上边的距离(纯粹的内容的上边界,不含padding)
            final int parentRight = r - l - getPaddingRight();//这个MyViewGroup的最右边的距离(纯粹的内容的右边界,不含padding)
            final int parentBottom = b - t - getPaddingBottom();//这个MyViewGroup的最下边的距离(纯粹的内容的下边界,不含padding)

            if (BuildConfig.DEBUG)
                Log.d("onlayout", "parentleft: " + parentLeft + "   parenttop: "
                        + parentTop + "   parentright: " + parentRight
                        + "   parentbottom: " + parentBottom + "\n" + "   l: " + l + "   t: " + t + "   r: " + r + "   b: " + b);

            int left = parentLeft;
            int top = parentTop;

            int count = getChildCount();
            for (int i = 0; i < count; i++) {
                View v = getChildAt(i);
                if (v.getVisibility() != View.GONE) {
                    //得到每一个子View的测量后的宽高
                    final int childWidth = v.getMeasuredWidth();
                    final int childHeight = v.getMeasuredHeight();
                    //开始布局每一个子View(左、上、右=左+子View宽、下=上+子View高)
                    v.layout(left, top, left + childWidth, top + childHeight);
                    //由于本例是横向排列的,所以每一个子View的left值要递增
                    left += childWidth;
                }
            }
        }
    }
总结:

一般情况,自定义ViewGroup支持wrap-content和padding就够用了

第二步、自己来写一个横向的LinearLayout(实现支持子View的margin)

每一个自定义ViewGroup都必须,自定义这个类LayoutParams,以及后面的三个方法,否则强转报异常,
其余没什么好说的,计算距离,布局的时候把margin考虑进去即可

public class MyViewGroupMargin extends ViewGroup {

        private int desireWidth;
        private int desireHeight;

        public MyViewGroupMargin(Context context) {
            this(context, null);
        }

        public MyViewGroupMargin(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

            // ★1. 计算所有child view 要占用的空间
            desireWidth = 0;//累加所有子View的宽度,作为MyViewGroup宽度设为wrap_content时的宽度
            desireHeight = 0;//本例子是横向排列的ViewGroup,所以,MyViewGroup高度设为wrap_content时,其高度是其所有子View中最高子View的高度
            int count = getChildCount();
            for (int i = 0; i < count; ++i) {
                View v = getChildAt(i);
                //1.1 开始遍历测量所有的子View,并且根据实际情况累加子View的宽(或者高),为了计算整个viewgroup的宽度(高度)
                if (v.getVisibility() != View.GONE) {//不去测量Gone的子View

                    LayoutParams lp = (LayoutParams) v.getLayoutParams();

                    //▲变化1:将measureChild改为measureChildWithMargin
                    measureChildWithMargins(v, widthMeasureSpec, 0,
                            heightMeasureSpec, 0);
                  /*原来:  measureChild(v, widthMeasureSpec,
                            heightMeasureSpec);*/

                    //▲变化2:这里在累加所有的子View的宽度时加上他自己的margin
                    desireWidth += v.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
                    desireHeight = Math
                            .max(desireHeight, v.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);

                    /*原来://由于横向排列,累加所有的子View的宽度
                    desireWidth += v.getMeasuredWidth();
                    //高度是子View中最高的高度
                    desireHeight = Math
                            .max(desireHeight, v.getMeasuredHeight());*/
                }
            }

            // 1.2 考虑padding值
            //到目前为止desireWidth为所有子View的宽度的累加,作为MyViewGroup的总宽度,要加上左右padding值
            desireWidth += getPaddingLeft() + getPaddingRight();
            //高度同理略
            desireHeight += getPaddingTop() + getPaddingBottom();


            //★2.测量ViewGroup的宽高,如果不写这一步,使用wrap_content时效果为match_parent的效果
            // (下面的写法比较简洁,《Android群英传》介绍了另外一种写法,比这个稍微麻烦一点)
            // see if the size is big enough
            desireWidth = Math.max(desireWidth, getSuggestedMinimumWidth());
            desireHeight = Math.max(desireHeight, getSuggestedMinimumHeight());

            setMeasuredDimension(resolveSize(desireWidth, widthMeasureSpec),
                    resolveSize(desireHeight, heightMeasureSpec));
        }



        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            final int parentLeft = getPaddingLeft();
            final int parentRight = r - l - getPaddingRight();
            final int parentTop = getPaddingTop();
            final int parentBottom = b - t - getPaddingBottom();

            if (BuildConfig.DEBUG)
                Log.d("onlayout", "parentleft: " + parentLeft + "   parenttop: "
                        + parentTop + "   parentright: " + parentRight
                        + "   parentbottom: " + parentBottom);

            int left = parentLeft;
            int top = parentTop;

            int count = getChildCount();
            for (int i = 0; i < count; ++i) {
                View v = getChildAt(i);
                if (v.getVisibility() != View.GONE) {
                    LayoutParams lp = (LayoutParams) v.getLayoutParams();
                    final int childWidth = v.getMeasuredWidth();
                    final int childHeight = v.getMeasuredHeight();


                    //▲变化1:左侧要加上这个子View的左侧margin
                    left += lp.leftMargin;
                    //▲变化2:上侧要加上子View的margin
                    top = parentTop + lp.topMargin;

                    if (BuildConfig.DEBUG) {
                        Log.d("onlayout", "child[width: " + childWidth
                                + ", height: " + childHeight + "]");
                        Log.d("onlayout", "child[left: " + left + ", top: "
                                + top + ", right: " + (left + childWidth)
                                + ", bottom: " + (top + childHeight));
                    }
                    v.layout(left, top, left + childWidth, top + childHeight);
                    //▲变化3:因为是横向排列的,所以下一个View的左侧加上这个view的右侧的margin(如果是纵向排列的则对应改变top)
                    left += childWidth + lp.rightMargin;

                }
            }
        }

        //★★★★★★★★★★★★★★★★★★★★★★★要使用margin必须写下面的方法★★★★★★★★★★★★★★★★★★★★★
        //***开始***每一个自定义ViewGroup都必须,自定义这个类LayoutParams,以及后面的三个方法,否则强转报异常,模板代码照抄即可**************

        public static class LayoutParams extends MarginLayoutParams {


            public LayoutParams(Context c, AttributeSet attrs) {
                super(c, attrs);

            }

            public LayoutParams(int width, int height) {
                super(width, height);
            }



            public LayoutParams(ViewGroup.LayoutParams source) {
                super(source);
            }

            public LayoutParams(MarginLayoutParams source) {
                super(source);
            }
        }

        @Override
        protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
            return new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);
        }

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

        @Override
        protected ViewGroup.LayoutParams generateLayoutParams(
                ViewGroup.LayoutParams p) {
            return new LayoutParams(p);
        }
        //***结束***每一个自定义ViewGroup都必须,自定义这个类LayoutParams,以及后面的三个方法,否则强转报异常,模板代码照抄即可**************
    }
文华指标源码—区间彩带 这就是当年东方财富软件终端里主打经典的指标、主要揭示主力成本区域。 阅读详情

相关推荐

php对接建行h5网页支付

php对接建行h5网页支付前言H5页面支付H5页面支付回调通知退款及其他的业务 前言 最近接到公司乙方要求,需要再支付上面增加建行的支付渠道。之前一直用的都是微信和支付宝这种第三方支付平台,银行直接对接比较少。没办法就只能上网搜索,搜索一番返现网上对接建行的资料比较少,没办法只好摸着石头过河,中间也借鉴了一些大佬的文章内容。 H5页面支付 根据建行的h5网页支付对接文档,还是可以看出是比较简单的。...

lihua100862的博客 5411

Android自定义View深度解析(四、自定义ViewGroup打造自己的布局容器)

转载请标明出处: http://blog.youkuaiyun.com/xmxkf/article/details/51490283 本文出自:【openXu的博客】 目录:简单实现水平排列效果 自定义LayoutParams 大致明确布局容器的需求初步定义布局属性 继承LayoutParams定义布局参数类 重写generateLayoutParams 在布局文件中使用布局属性 在o

openXu的专栏 2万+

轴承故障诊断——领域知识

幅域分析、频域分析及轴承方面的领域知识

qq_58516607的博客 3536

自定义View,有这一篇就够了

我的简书同步发布:自定义View,有这一篇就够了 为了扫除学习中的盲点,尽可能多的覆盖Android知识的边边角角,决定对自定义View做一个稍微全面一点的使用方法总结,在内容并没有什么独特,其他大神们的博客上面基本上都有讲这方面的内容,如果你对自定义View很熟了,那么就不用往下看啦~。如果对自定义View不是很熟,或者说很多内容忘记了想复习一下,更或者说是从来没用过,欢迎跟我一起重温这方面的知识

huachao1001的专栏 7万+

告别概念晕眩:用TC3xx SMU和TLF35584的配置实例,搞懂ASIL D功能安全落地

本文通过英飞凌TC3xx系列MCU的SMU模块与TLF35584电源管理芯片的协同配置实例,详细解析了如何实现符合ASIL D功能安全标准的刹车辅助ECU。文章涵盖SMU报警源配置、响应动作类型、TLF35584的安全状态管理,以及构建完整安全闭环的实践方法,帮助工程师将抽象的安全概念落地为具体设计方案。

weixin_30647065的博客 439

STM32F407-OV7670(无FIFO)-ONENET-实现摄像头画面上传到onenet(EDP协议)

EDP协议 EDP协议文档说明:https://leoeinstein.lanzous.com/ifX1Ckfkaaf 服务器登录 登录流程: (1)客户端发送连接请求(CONN_REQ) (2)服务器验证请求的合法性 (3)服务器发送一个回执(CONN_RESP)给客户端 其中请求包含三部分:消息头、选项和消息体。 1、消息头 包括消息的类型和剩余消息长度。 2、选项 包括协议名称、协议版本、连接标志、保持连接时间。 3、消息体 可能包含设备ID、用户ID(可选)、鉴权信息(看采取什么方式登录)。 设备

LiangWF22的博客 1万+

自定义View绘制心得(自定义view和自定义viewGroup)

自定义view和viewGroup 的差异和方法

NELA的博客 1494

3D打印切片软件Cura及CuraEngine原理分析

引言         年初开始进入3D打印行业,受命以Cura为基础,研发一款自主的3D打印切片软件。         自主研发要取其长处,补其不足,首先自然是要搞清楚Cura到底做了什么,读Cura的代码是必需的。我一向都觉得比起自己写代码来,读别人的代码是一个漫又而痛苦的过程,读者的思想与写者总有偏差,往往又无法验证自己的猜想是否正确,只叹人脑不是电脑,无法把眼前的代码从头到尾执行一遍...

AiDiShengDeXiaoWu的博客 4423

自定义最大高度的ViewGroup

我们有个需求,就是ViewGroup 最大的高度是多少,我们可以用下面的代码试下: import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.widget.FrameLayout; import com.xiaomi.mico.b

男儿不展风云志,空有天生八尺躯 775

网络可视化工具netron详细安装流程

netron安装目录1.netron 简介2.不同操作系统下的安装使用方式2.1 在线版本:只要有浏览器就可以2.2 不同操作系统安装使用3.netron支持的网络框架4.netron测试演示 1.netron 简介 在实际的项目中,经过会遇到各种网络模型,需要我们快速去了解网络结构。如果单纯的去看模型文件,脑海中很难直观的浮现网络的架构。 这时,就可以使用netron可视化工具,可以清晰的看到每一层的输入输出,网络总体的架构,而且支持各种不同网络框架,简单好用。 2.不同操作系统下的安装使用方式 2.1

江南研习社 12万+

RK3568项目(四)--uboot启动流程之启动模式选择

本章接着上面,接着来分析uboot启动流程,设计vendor、按键、驱动模式的选择等

文艺小少年的博客 584

自定义ViewGroup——自定义布局

自定义ViewGroup和自定义View的步骤差不多。 自定义ViewGroup需要重写onMeasure方法测量子控件的宽高和自己的宽高,然后在onLayout方法中摆放子控件。 自定义View则是需要重写onMeasure根据测量模式和父控件给出的建议的宽高值计算自己的宽高,然后在父控件为其指定的区域绘制自己的图形。 自定义ViewGroup的步骤: ①. 继承ViewGroup,覆盖构造...

weixin_40763897的博客 2985

华为OD机试真题2026双机位C卷 Python&JS 语言 实现【主次关联成环警告】

在ICT运维领域,现网运维工程师面向对设备上报的众多告警,往往需要筛选出最主要的告警优先处理,次等级的告警或许为同一个根因导致的告警,处理优先级会放后或者不处理,这样就诞生出主次关联告警的概念。给定一系列告警的主次关联关系,判断是否存在如下情况:

MISAYAONE的博客 269

Android 手把手教您自定义ViewGroup(一)

转载请标明出处:http://blog.youkuaiyun.com/lmj623565791/article/details/38339817 , 本文出自:【张鸿洋的博客】最近由于工作的变动,导致的博客的更新计划有点被打乱,希望可以尽快脉动回来~今天给大家带来一篇自定义ViewGroup的教程,说白了,就是教大家如何自定义ViewGroup,如果你对自定义ViewGroup还不是很了解,或者正想学习如何自

Hongyang 29万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android自定义View/ViewGroup

一、基本步骤 自定义属性; 重写onMeasure()方法; 重写onDraw()方法; 重写onLayout()方法; 选择和设置构造方法; 重写其他事件的方法(滑动监听等) 二、常用到的View方法 实现一个自定义视图,通常要提供框架在所有视图上都会调用的标准方法的重写,这些标准方法有: 分类 方法 描述 创建 构造器 有一种构造器形式是当视图是从代码创建时调用的;还有另一...

weixin_40763897的博客 2551

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android自定义ViewGroup入门

Android自定义ViewGroup入门 ViewGroup ViewGroup是View的容器类,自定义ViewGroup就是继承ViewGroup,重写其中onMeasure()和onLayout()方法。 onMeasure() onMeasure()这个方法中测量容器的大小,在这里你需要将自定义ViewGroup宽高测量出来,并且在setMeasuredDime...

y76603280的博客 313

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【自定义控件】自定义ViewGroup 在ViewGroup中显示TextView

ViewGroup学习 demo:在ViewGroup中显示一个TextView demo:在ViewGroup中显示两个TextView 并且按照某种效果进行布局

在远处,不远处 8998

自定义viewgroup

自定义viewgroup 多个控件组合在一起,集成viewgroup,核心在于如何将你想要的组件引入到viewgroup中去? 有两种方法 方法一 自定义viewgroup,在内部完成自己的业务逻辑处理,测量、布局等其他逻辑;最后在java代码中用你自定义的viewgroup.addview(view)方法逐一添加进去 方法二 在自定义viewgroup的构造方法中引入,用findviewbyID...

jackzhouyu的专栏 520

自定义View二篇,如何自定义一个规范的ViewGroup

前言 在自定义View开篇,必须跨过的一道坎儿中,我们介绍了自定义View的几种方式,以及如何实现一个规范的自定义View,上文中也说了,实现一个规范的自定义ViewGroup是一件比较困难的事情,因为要考虑的情况包含 本身的padding以及子view的margin 与 本身wrap_content 问题。 如何实现一个规范的ViewGroup,以实现垂直布局的LinerLayout为...

黄林晴 7428

如何自定义ViewGroup

如何自定义ViewGroup

自由人 1061

android 自定义View与ViewGroup

一、概述: (一)、View和ViewGroup的职责 1、ViewGroup的职责是什么?         ViewGroup相当于一个放置View的容器,在写布局xml的时候,会告诉容器(凡是以layout开头的属性,都是为用于告诉容器),容器宽度(layout_width)、高度(layout_height)、对齐方式(layout_gravity),还有margin等。因此View...

bobo的博客 2196

Android 自定义ViewGroup

转载请标明出处:http://blog.youkuaiyun.com/lmj623565791/article/details/38339817 , 本文出自:【张鸿洋的博客】 今天给大家带来一篇自定义ViewGroup的教程,说白了,就是教大家如何自定义ViewGroup,如果你对自定义ViewGroup还不是很了解,或者正想学习如何自定义,那么你可以好好看看这篇博客。 1、概述 在写代码之前,我必须得...

weixin_41729259的博客 293
上一篇: Service之基础(开启服务、绑定本地服务)
下一篇: canvas drawText如何换行
Android_Study_OK
博客等级 码龄11年 91粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值