精华内容
下载资源
问答
  • Tab控件标准重新修订

    2020-12-30 11:29:01
    <p><code>Tab控件的主元素中可以包含一个导航条元素,该导航条元素结构必须如下所示: <pre><code> <ul data-role="navigator"> <li data-for="a">tab1</li>...
  • 本文实例介绍了AndroidLinearLayout、AbsoluteLayout的用法,希望能对于初学Android的朋友起到一点帮助作用。具体内容如下: Android 的UI 布局都以Layout ...Gravity= “center” ,Layout 中的控件居中 layout_w
  • JAVA_API1.6文档(中文)

    万次下载 热门讨论 2010-04-12 13:31:34
    java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的...
  • 1、 以下数据结构不属于线性数据结构的是()。 A、队列 B、线性表 C、二叉树 D、栈 我的答案:C 2、 在结构化方法,用数据流程图(DFD)作为描述工具的软件开发阶段是()。 A、 可行性分析 B、需求分析 ...
  • 除在保密期内保密论文和在技术保护期限内论文外,允许论文被查阅和借阅,可以公布(包括以电子信息形式刊登)论文全部内容或、英文摘要等部分内容。论文公布(包括以电子信息形式刊登)授权东南大学研究生...
  • 常见以下几种方式,比如通过Show/ShowDialog方法显示新窗口,通过多文档界面(MDI)在父窗口加载子窗口,或者是通关过在窗口动态加载自定义控件,比如通过将窗口中的Panel控件作为容器,将一些自定义元素...
  • 第6页 C#(WINFORM)学习 找到集合数量最多一个元素 利用方法来查找,可以返回两个变量。 object Jmax0(ArrayList v11,ref int jj) { int i; object j0=0; ArrayList y11=new ArrayList(); //各个不同元素...
  • Java 1.6 API 中文 New

    2013-10-26 14:08:22
    java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的...
  • JavaAPI中文chm文档 part2

    2011-08-19 08:58:42
    java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的...
  • Android UI 布局都以Layout 作为容器,在上面按照规定排列控件,这方面跟JAVA Swing 和LWUIT 很像。控件跟Layout 有很多属性是一样可以在Properties 面修改,跟.NET/Delphi 等RAD 类似,其中最常用属性有...

    Android 的UI 布局都以Layout 作为容器,在上面按照规定排列控件,这方面跟JAVA 的Swing 和LWUIT 很像。控件跟Layout 有很多属性是一样的,可以在Properties 面修改,跟.NET/Delphi 等RAD 类似,其中最常用的属性有以下这些:

    id="@+id/edtInput",ID 是连接UI 与代码的桥梁

    Gravity= "center" ,Layout 中的控件居中

     

    layout_width="fill_parent" ,自动填充至屏幕宽度,layout_height 同理

     

    layout_width="wrap_content" ,自动填充为控件大小,layout_height 同理

     

    LinearLayout ,在入门第一篇所用的Layout 就是LinearLayout ,它的理解很简单:在LinearLayout 面的控件,按照水平或者垂直排列:
    orientation="horizontal" :水平排列;orientation=" vertical" :垂直排列 
    当LinearLayout 是horizontal ,并且面的控件使用了layout_width="fill_parent" ,第二组控件会挡在屏幕的右边,那也就是看不到了。。。

    AbsoluteLayout ,是一个按照绝对坐标定义的布局,由于使用绝对坐标去定位控件,因此要实现自适应界面时,应尽少使用 AbsoluteLayout 。 AbsoluteLayout 面的控件都以layout_x 、layout_y 来定义其位置:

     

    上图中的TextView01的X坐标为10px,Y坐标为10px:

    1. <AbsoluteLayout android:id="@+id/AbsoluteLayout01" android:layout_height="wrap_content" android:layout_width="fill_parent" >       
    2. <TextView android:text="TextView01" android:id="@+id/TextView01" android:layout_height="wrap_content" android:layout_y="10px" android:layout_width【快讯】医药板块表现强势机构:关注低估值蓝筹股、医药股等="wrap_content" android:layout_x="110px">       
    3. </TextView>       
    4. </AbsoluteLayout>  
    1. <AbsoluteLayout android:id="@+id/AbsoluteLayout01" android:layout_height="wrap_content" android:layout_width="fill_parent" >     
    2. <TextView android:text="TextView01" android:id="@+id/TextView01" android:layout_height="wrap_content" android:layout_y="10px" android:layout_width="wrap_content" android:layout_x="110px">     
    3. </TextView>     
    4. </AbsoluteLayout>    

     


         本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/819882,如需转载请自行联系原作者


    展开全文
  • JavaAPI1.6中文chm文档 part1

    热门讨论 2011-08-19 08:33:34
    java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的...
  • Android UI界面由以下树形结构组成, 从图中可以看出, UI界面是有View与ViewGroup两大类控件组成,在下面树形图中不管是View还是ViewGroup都是从android.view.View中派生, 而ViewGroup作为容器, 它可以装载和管理其下...

    Android UI界面由以下树形结构组成, 从图中可以看出, UI界面是有View与ViewGroup两大类控件组成,在下面树形图中不管是View还是ViewGroup都是从android.view.View中派生, 而ViewGroup作为容器, 它可以装载和管理其下的一些列由android.view.View派生出来的元素(View和ViewGroup):

           

          由android.view.View派生出来的单一控件元素常见的有TextView, Button, ImageView等, 派生出的容器有LinearLayout, FrameLayout 等, 也有一些由ViewGroup派生出来的控件做为单一控件元素使用的, 比如说ListView, 当然我们也可以把ListView当做容器使用。Android通过布局可以完成很多有创意富有美感的界面, ViewGroup的作用很大,这里单独拿出来研究。

     

      ViewGroup实现了android.view.ViewParent和android.view.ViewManager两个接口, 赋予其装载子控件和管理子控件的能力。这篇主要讲Android控件如何绘制到界面上的。

      控件显示到界面上主要分三个流程, 如下图。这是一个非常自然的想法, 得到大小后才可以布局, 布局好了才可以绘制; 这三个流程都是按照上图树形结构递归的。对于这三个流程,只要对Android控件稍有研究的人都

             

    会发现, 每一个控件都有measure(), layout(), draw()方法, 下面分别分析其作用:

    measure 递归: 

        1、判断是否需要重新计算大小

        2、调用onMeasure, 如果是ViewGroup类型, 则遍历所有子控件的measure方法,计算出子控件大小,

        3、使用setMeasuredDimension(int, int)确定自身计算的大小

        由于第二步会调用子控件的measure方法, 在子控件的大小计算当中也会经历这三步动作, 直到整个树遍历完, 此时此控件及其子控件的大小都确定了, 在这里强调控件的大小是由父控件和自身决定的,当然取决在于父控件, 控件自身只提供参考值, 这是因为控件的measure方法是由父控件调用的, 而父控件的控件有限,可能不完全按照你的申请要求给出, 这里留待以后讨论关于布局参数问题。

    在android.view.View对于measure流程已经实现了一部分:

    public final void measure(int widthMeasureSpec, int heightMeasureSpec) {
         ...
       // measure ourselves, this should set the measured dimension flag back
         onMeasure(widthMeasureSpec, heightMeasureSpec);
         ...
    }


    对于android.view.View来说它不需要遍历子控件了, 下面贴出一个我实现的一个onMeasure :

    @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            //获取mode和size, 方便给children分配空间
            final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    
            final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    
            //TODO 这里可以检查你的大小, 或者mode
    
            final int count = getChildCount();
            for(int i = 0; i < count; i++) {
                final View view = getChildAt(i);
    
                //这里只是举一个例子, 这里给child多少大小根据实际来定
                int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY);
                int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY);
    
                view.measure(childWidthMeasureSpec, childHeightMeasureSpec);
            }
    
            // 得出自己计算出的大小, 这里也是一个例子, 可以根据所有子控件占多大空间
            // 给出, 这里也根据要实现的效果看, 这部分建议看LinearLayout等容器的源码
            setMeasuredDimension(widthSize, heightSize);
        }

    layout 递归: 

        1、设置自身相对父控件的位置并判断是否需要重新布局,使用setFrame(left, top, right, bottom);

        2、调用onLayout()布局子控件

    在android.view.View也实现了此流程的一部分:

    public void layout(int l, int t, int r, int b) {
        ...
        onLayout(changed, l, t, r, b);
        ...
    }

    下面我也简单的实现了第二步:

    @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            final int count = getChildCount();
            int widthSpan = 0;
            int heightSpan = 0;
            for(int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                child.layout(widthSpan, heightSpan, child.getMeasuredWidth(), child.getMeasuredHeight());
                widthSpan += child.getMeasuredWidth();
                heightSpan += child.getMeasuredHeight();
            }
        }

    这是一个简陋的Grid布局。 

    draw递归: 

        1、绘制背景 

        2、调用onDraw()绘制控件内容

        3、调用dispatchDraw()绘制所有的子控件

        4、绘制渐变边界等

        5、绘制装饰品, 比如滑动条等

    draw递归在android.view.View已经有完整的实现, 自定义ViewGroup时一般只需要重写onDraw实现如何绘制内容就够了, 当然所有的流程都可以重写, 如果需要的话。下面看一下android.view.View里面draw递归的原型:


    public void draw(Canvas canvas) {
            // Step 1, draw the background, if needed
            ...// Step 2, draw the content
            onDraw(canvas);
    
            // Step 3, draw the children
            dispatchDraw(canvas);
    
            // Step 4, draw the fade effect and restore layers
            ...
        
         //Step 5, draw decorations
            onDrawScrollBars(canvas);
    }
    上面三个递归, 解决了一颗控件树的显示问题, 现在大家会很奇怪, 到底是谁发起这个递归, 即最上层的父控件到底是谁, 查看源码可以看到, 在android.view下面有一个ViewRoot(更新后变成ViewRootImpl)隐藏类, 在其performTraversals()方法中发起这三个递归,这个类没有研究太深入, 以后补上。在performTraversals()中大概的流程是:

    private void performTraversals() {
         final View host = mView;
         ...
         host.measure();
         ...
         host.layout();
         ...
         host.draw();
         ...
    }
    这样就实现了一个大的递归, 把完整的界面给绘制出来了。下面我自己写一个实现ViewGroup的Demo:

    package com.ui.viewgroup;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.util.AttributeSet;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class ViewGroupImpl extends ViewGroup {
    
        public class LayoutParams extends ViewGroup.LayoutParams {
            public int left = 0;
            public int top = 0;
    
            public LayoutParams(int width, int height) {
                super(width, height);
            }
    
            public LayoutParams(int left, int top, int width, int height) {
                super(width, height);
                this.left = left;
                this.top = top;
            }
        }
    
        public ViewGroupImpl(Context context) {
            this(context, null);
        }
    
        public ViewGroupImpl(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public void addInScreen(View child, int left, int top, int width, int height) {
            addView(child, new LayoutParams(left, top, width, height));
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    
            // 检测控件大小是否符合要求
            if(widthMode == MeasureSpec.UNSPECIFIED || heightMode == MeasureSpec.UNSPECIFIED) {
                throw new IllegalArgumentException("不合法的MeasureSpec mode");
            }
    
            // 计算子控件大小
            final int count = getChildCount();
            for(int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                final LayoutParams lp = (LayoutParams)child.getLayoutParams();
    
                //确定大小的
                final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width,
                        MeasureSpec.EXACTLY);
                final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height,
                        MeasureSpec.EXACTLY);
    
                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
            }
    
            // 设置计算的控件大小
            setMeasuredDimension(widthSize, heightSize);
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            final int count = getChildCount();
            LayoutParams lp;
            for(int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                lp = (LayoutParams)child.getLayoutParams();
                //相对父控件坐标
                child.layout(lp.left, lp.top, lp.left + lp.width, lp.top + lp.width);
            }
        }
    
        // draw递归 不需要我们接管,
    
        @Override
        public void draw(Canvas canvas) {
            super.draw(canvas);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
        }
    
        @Override
        protected void dispatchDraw(Canvas canvas) {
            super.dispatchDraw(canvas);
        }
    }

    Activity:

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            ViewGroupImpl viewGroupImpl = new ViewGroupImpl(this);
            setContentView(viewGroupImpl, new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT));
    
            // 因为此时无法获取viewGroupImpl的实际大小, 所以只好假设一个大小
            final int parentWidth = 400;
            final int parentHeight = 700;
    
            final int maxWidthSize = parentWidth / 4;
            final int maxHeightSize = parentHeight / 4;
    
            Random random = new Random();
    
            for(int i = 0; i < 50; i++) {
                int left = random.nextInt(parentWidth) - 10;
                int top = random.nextInt(parentHeight) - 10;
    
                int width = random.nextInt(maxWidthSize) + 10;
                int height = random.nextInt(maxHeightSize) + 10;
    
                ImageView child = new ImageView(this);
                child.setImageResource(R.drawable.ic_launcher);
                viewGroupImpl.addInScreen(child, left, top, width, height);
            }

    下面是效果图:



    出处:http://www.cnblogs.com/thinear/archive/2012/07/23/2605153.html
    展开全文
  • ViewGroup学习(一)

    千次阅读 2012-07-24 11:07:39
    Android UI界面由以下树形结构组成, 从图中可以看出, UI界面是有View与ViewGroup两大类控件组成,在下面树形图中不管是View还是ViewGroup都是从android.view.View中派生, 而ViewGroup作为容器, 它可以装载和管理其...

      Android UI界面由以下树形结构组成, 从图中可以看出, UI界面是有View与ViewGroup两大类控件组成,在下面树形图中不管是View还是ViewGroup都是从android.view.View中派生, 而ViewGroup作为容器, 它可以装载和管理其下的一些列由android.view.View派生出来的元素(View和ViewGroup):

           

          由android.view.View派生出来的单一控件元素常见的有TextView, Button, ImageView等, 派生出的容器有LinearLayout, FrameLayout 等, 也有一些由ViewGroup派生出来的控件做为单一控件元素使用的, 比如说ListView, 当然我们也可以把ListView当做容器使用。Android通过布局可以完成很多有创意富有美感的界面, ViewGroup的作用很大,这里单独拿出来研究。

     

      ViewGroup实现了android.view.ViewParent和android.view.ViewManager两个接口, 赋予其装载子控件和管理子控件的能力。这篇主要讲Android控件如何绘制到界面上的。

      控件显示到界面上主要分三个流程, 如下图。这是一个非常自然的想法, 得到大小后才可以布局, 布局好了才可以绘制; 这三个流程都是按照上图树形结构递归的。对于这三个流程,只要对Android控件稍有研究的人都

             

    会发现, 每一个控件都有measure(), layout(), draw()方法, 下面分别分析其作用:

    measure 递归: 

        1、判断是否需要重新计算大小

        2、调用onMeasure, 如果是ViewGroup类型, 则遍历所有子控件的measure方法,计算出子控件大小,

        3、使用setMeasuredDimension(int, int)确定自身计算的大小

        由于第二步会调用子控件的measure方法, 在子控件的大小计算当中也会经历这三步动作, 直到整个树遍历完, 此时此控件及其子控件的大小都确定了, 在这里强调控件的大小是由父控件和自身决定的,当然取决在于父控件, 控件自身只提供参考值, 这是因为控件的measure方法是由父控件调用的, 而父控件的控件有限,可能不完全按照你的申请要求给出, 这里留待以后讨论关于布局参数问题。

    在android.view.View对于measure流程已经实现了一部分:

    public final void measure(int widthMeasureSpec, int heightMeasureSpec) {
    ...
       // measure ourselves, this should set the measured dimension flag back onMeasure(widthMeasureSpec, heightMeasureSpec);
    ... }

    对于android.view.View来说它不需要遍历子控件了, 下面贴出一个我实现的一个onMeasure :

    复制代码
    @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            //获取mode和size, 方便给children分配空间
            final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    
            final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    
            //TODO 这里可以检查你的大小, 或者mode
    
            final int count = getChildCount();
            for(int i = 0; i < count; i++) {
                final View view = getChildAt(i);
    
                //这里只是举一个例子, 这里给child多少大小根据实际来定
                int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY);
                int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY);
    
                view.measure(childWidthMeasureSpec, childHeightMeasureSpec);
            }
    
            // 得出自己计算出的大小, 这里也是一个例子, 可以根据所有子控件占多大空间
            // 给出, 这里也根据要实现的效果看, 这部分建议看LinearLayout等容器的源码
            setMeasuredDimension(widthSize, heightSize);
        }
    复制代码

     

    layout 递归: 

        1、设置自身相对父控件的位置并判断是否需要重新布局,使用setFrame(left, top, right, bottom);

        2、调用onLayout()布局子控件

    在android.view.View也实现了此流程的一部分:

    public void layout(int l, int t, int r, int b) {
    ... onLayout(changed, l, t, r, b);
    ... }

    下面我也简单的实现了第二步:

    复制代码
    @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            final int count = getChildCount();
            int widthSpan = 0;
            int heightSpan = 0;
            for(int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                child.layout(widthSpan, heightSpan, child.getMeasuredWidth(), child.getMeasuredHeight());
                widthSpan += child.getMeasuredWidth();
                heightSpan += child.getMeasuredHeight();
            }
        }
    复制代码

    这是一个简陋的Grid布局。 

    draw递归: 

        1、绘制背景 

        2、调用onDraw()绘制控件内容

        3、调用dispatchDraw()绘制所有的子控件

        4、绘制渐变边界等

        5、绘制装饰品, 比如滑动条等

    draw递归在android.view.View已经有完整的实现, 自定义ViewGroup时一般只需要重写onDraw实现如何绘制内容就够了, 当然所有的流程都可以重写, 如果需要的话。下面看一下android.view.View里面draw递归的原型:

    复制代码
    public void draw(Canvas canvas) {
            // Step 1, draw the background, if needed
            ...// Step 2, draw the content
            onDraw(canvas);
    
            // Step 3, draw the children
            dispatchDraw(canvas);
    
            // Step 4, draw the fade effect and restore layers
            ...
        
         //Step 5, draw decorations onDrawScrollBars(canvas); }
    复制代码

         上面三个递归, 解决了一颗控件树的显示问题, 现在大家会很奇怪, 到底是谁发起这个递归, 即最上层的父控件到底是谁, 查看源码可以看到, 在android.view下面有一个ViewRoot(更新后变成ViewRootImpl)隐藏类, 在其performTraversals()方法中发起这三个递归,这个类没有研究太深入, 以后补上。在performTraversals()中大概的流程是:

    复制代码
    private void performTraversals() {
         final View host = mView;
         ...
         host.measure();
         ...
         host.layout();
         ...
         host.draw();
         ...
    }
    复制代码

    这样就实现了一个大的递归, 把完整的界面给绘制出来了。下面我自己写一个实现ViewGroup的Demo:

    复制代码
    package com.ui.viewgroup;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.util.AttributeSet;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class ViewGroupImpl extends ViewGroup {
    
        public class LayoutParams extends ViewGroup.LayoutParams {
            public int left = 0;
            public int top = 0;
    
            public LayoutParams(int width, int height) {
                super(width, height);
            }
    
            public LayoutParams(int left, int top, int width, int height) {
                super(width, height);
                this.left = left;
                this.top = top;
            }
        }
    
        public ViewGroupImpl(Context context) {
            this(context, null);
        }
    
        public ViewGroupImpl(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public void addInScreen(View child, int left, int top, int width, int height) {
            addView(child, new LayoutParams(left, top, width, height));
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    
            // 检测控件大小是否符合要求
            if(widthMode == MeasureSpec.UNSPECIFIED || heightMode == MeasureSpec.UNSPECIFIED) {
                throw new IllegalArgumentException("不合法的MeasureSpec mode");
            }
    
            // 计算子控件大小
            final int count = getChildCount();
            for(int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                final LayoutParams lp = (LayoutParams)child.getLayoutParams();
    
                //确定大小的
                final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width,
                        MeasureSpec.EXACTLY);
                final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height,
                        MeasureSpec.EXACTLY);
    
                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
            }
    
            // 设置计算的控件大小
            setMeasuredDimension(widthSize, heightSize);
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            final int count = getChildCount();
            LayoutParams lp;
            for(int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                lp = (LayoutParams)child.getLayoutParams();
                //相对父控件坐标
                child.layout(lp.left, lp.top, lp.left + lp.width, lp.top + lp.width);
            }
        }
    
        // draw递归 不需要我们接管,
    
        @Override
        public void draw(Canvas canvas) {
            super.draw(canvas);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
        }
    
        @Override
        protected void dispatchDraw(Canvas canvas) {
            super.dispatchDraw(canvas);
        }
    }
    复制代码

    Activity:

    复制代码
    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            ViewGroupImpl viewGroupImpl = new ViewGroupImpl(this);
            setContentView(viewGroupImpl, new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT));
    
            // 因为此时无法获取viewGroupImpl的实际大小, 所以只好假设一个大小
            final int parentWidth = 400;
            final int parentHeight = 700;
    
            final int maxWidthSize = parentWidth / 4;
            final int maxHeightSize = parentHeight / 4;
    
            Random random = new Random();
    
            for(int i = 0; i < 50; i++) {
                int left = random.nextInt(parentWidth) - 10;
                int top = random.nextInt(parentHeight) - 10;
    
                int width = random.nextInt(maxWidthSize) + 10;
                int height = random.nextInt(maxHeightSize) + 10;
    
                ImageView child = new ImageView(this);
                child.setImageResource(R.drawable.ic_launcher);
                viewGroupImpl.addInScreen(child, left, top, width, height);
            }
    复制代码

    下面是效果图:

    原文转自:http://www.cnblogs.com/thinear/archive/2012/07/23/2605153.html

    展开全文
  • ViewGroup学习之作图过程

    千次阅读 2014-06-07 13:00:29
    Android UI界面由以下树形结构组成, 从图中可以看出, UI界面是有View与ViewGroup两大类控件组成,在下面树形图中不管是View还是ViewGroup都是从android.view.View中派生, 而ViewGroup作为容器, 它可以装载和管理其下...

    ViewGroup学习之绘制过程
    Android UI界面由以下树形结构组成, 从图中可以看出, UI界面是有View与ViewGroup两大类控件组成,在下面树形图中不管是View还是ViewGroup都是从android.view.View中派生, 而ViewGroup作为容器, 它可以装载和管理其下的一些列由android.view.View派生出来的元素(View和ViewGroup):

           

          由android.view.View派生出来的单一控件元素常见的有TextView, Button, ImageView等, 派生出的容器有LinearLayout, FrameLayout 等, 也有一些由ViewGroup派生出来的控件做为单一控件元素使用的, 比如说ListView, 当然我们也可以把ListView当做容器使用。Android通过布局可以完成很多有创意富有美感的界面, ViewGroup的作用很大,这里单独拿出来研究。

     

      ViewGroup实现了android.view.ViewParent和android.view.ViewManager两个接口, 赋予其装载子控件和管理子控件的能力。这篇主要讲Android控件如何绘制到界面上的。

      控件显示到界面上主要分三个流程, 如下图。这是一个非常自然的想法, 得到大小后才可以布局, 布局好了才可以绘制; 这三个流程都是按照上图树形结构递归的。对于这三个流程,只要对Android控件稍有研究的人都

             

    会发现, 每一个控件都有measure(), layout(), draw()方法, 下面分别分析其作用:

    measure 递归: 

        1、判断是否需要重新计算大小

        2、调用onMeasure, 如果是ViewGroup类型, 则遍历所有子控件的measure方法,计算出子控件大小,

        3、使用setMeasuredDimension(int, int)确定自身计算的大小

        由于第二步会调用子控件的measure方法, 在子控件的大小计算当中也会经历这三步动作, 直到整个树遍历完, 此时此控件及其子控件的大小都确定了, 在这里强调控件的大小是由父控件和自身决定的,当然取决在于父控件, 控件自身只提供参考值, 这是因为控件的measure方法是由父控件调用的, 而父控件的控件有限,可能不完全按照你的申请要求给出, 这里留待以后讨论关于布局参数问题。

    在android.view.View对于measure流程已经实现了一部分:

    public final void measure(int widthMeasureSpec, int heightMeasureSpec) {
         ...
       // measure ourselves, this should set the measured dimension flag back
         onMeasure(widthMeasureSpec, heightMeasureSpec);
         ...
    }

    对于android.view.View来说它不需要遍历子控件了, 下面贴出一个我实现的一个onMeasure :

    复制代码
    @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            //获取mode和size, 方便给children分配空间
            final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    
            final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    
            //TODO 这里可以检查你的大小, 或者mode
    
            final int count = getChildCount();
            for(int i = 0; i < count; i++) {
                final View view = getChildAt(i);
    
                //这里只是举一个例子, 这里给child多少大小根据实际来定
                int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY);
                int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY);
    
                view.measure(childWidthMeasureSpec, childHeightMeasureSpec);
            }
    
            // 得出自己计算出的大小, 这里也是一个例子, 可以根据所有子控件占多大空间
            // 给出, 这里也根据要实现的效果看, 这部分建议看LinearLayout等容器的源码
            setMeasuredDimension(widthSize, heightSize);
        }
    复制代码

     

    layout 递归: 

        1、设置自身相对父控件的位置并判断是否需要重新布局,使用setFrame(left, top, right, bottom);

        2、调用onLayout()布局子控件

    在android.view.View也实现了此流程的一部分:

    public void layout(int l, int t, int r, int b) {
        ...
        onLayout(changed, l, t, r, b);
        ...
    }

    下面我也简单的实现了第二步:

    复制代码
    @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            final int count = getChildCount();
            int widthSpan = 0;
            int heightSpan = 0;
            for(int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                child.layout(widthSpan, heightSpan, child.getMeasuredWidth(), child.getMeasuredHeight());
                widthSpan += child.getMeasuredWidth();
                heightSpan += child.getMeasuredHeight();
            }
        }
    复制代码

    这是一个简陋的Grid布局。 

    draw递归: 

        1、绘制背景 

        2、调用onDraw()绘制控件内容

        3、调用dispatchDraw()绘制所有的子控件

        4、绘制渐变边界等

        5、绘制装饰品, 比如滑动条等

    draw递归在android.view.View已经有完整的实现, 自定义ViewGroup时一般只需要重写onDraw实现如何绘制内容就够了, 当然所有的流程都可以重写, 如果需要的话。下面看一下android.view.View里面draw递归的原型:

    复制代码
    public void draw(Canvas canvas) {
            // Step 1, draw the background, if needed
            ...// Step 2, draw the content
            onDraw(canvas);
    
            // Step 3, draw the children
            dispatchDraw(canvas);
    
            // Step 4, draw the fade effect and restore layers
            ...
        
         //Step 5, draw decorations
            onDrawScrollBars(canvas);
    }
    复制代码

         上面三个递归, 解决了一颗控件树的显示问题, 现在大家会很奇怪, 到底是谁发起这个递归, 即最上层的父控件到底是谁, 查看源码可以看到, 在android.view下面有一个ViewRoot(更新后变成ViewRootImpl)隐藏类, 在其performTraversals()方法中发起这三个递归,这个类没有研究太深入, 以后补上。在performTraversals()中大概的流程是:

    复制代码
    private void performTraversals() {
         final View host = mView;
         ...
         host.measure();
         ...
         host.layout();
         ...
         host.draw();
         ...
    }
    复制代码

    这样就实现了一个大的递归, 把完整的界面给绘制出来了。下面我自己写一个实现ViewGroup的Demo:

    复制代码
    package com.ui.viewgroup;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.util.AttributeSet;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class ViewGroupImpl extends ViewGroup {
    
        public class LayoutParams extends ViewGroup.LayoutParams {
            public int left = 0;
            public int top = 0;
    
            public LayoutParams(int width, int height) {
                super(width, height);
            }
    
            public LayoutParams(int left, int top, int width, int height) {
                super(width, height);
                this.left = left;
                this.top = top;
            }
        }
    
        public ViewGroupImpl(Context context) {
            this(context, null);
        }
    
        public ViewGroupImpl(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public void addInScreen(View child, int left, int top, int width, int height) {
            addView(child, new LayoutParams(left, top, width, height));
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    
            // 检测控件大小是否符合要求
            if(widthMode == MeasureSpec.UNSPECIFIED || heightMode == MeasureSpec.UNSPECIFIED) {
                throw new IllegalArgumentException("不合法的MeasureSpec mode");
            }
    
            // 计算子控件大小
            final int count = getChildCount();
            for(int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                final LayoutParams lp = (LayoutParams)child.getLayoutParams();
    
                //确定大小的
                final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width,
                        MeasureSpec.EXACTLY);
                final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height,
                        MeasureSpec.EXACTLY);
    
                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
            }
    
            // 设置计算的控件大小
            setMeasuredDimension(widthSize, heightSize);
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            final int count = getChildCount();
            LayoutParams lp;
            for(int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                lp = (LayoutParams)child.getLayoutParams();
                //相对父控件坐标
                child.layout(lp.left, lp.top, lp.left + lp.width, lp.top + lp.width);
            }
        }
    
        // draw递归 不需要我们接管,
    
        @Override
        public void draw(Canvas canvas) {
            super.draw(canvas);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
        }
    
        @Override
        protected void dispatchDraw(Canvas canvas) {
            super.dispatchDraw(canvas);
        }
    }
    复制代码

    Activity:

    复制代码
    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            ViewGroupImpl viewGroupImpl = new ViewGroupImpl(this);
            setContentView(viewGroupImpl, new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT));
    
            // 因为此时无法获取viewGroupImpl的实际大小, 所以只好假设一个大小
            final int parentWidth = 400;
            final int parentHeight = 700;
    
            final int maxWidthSize = parentWidth / 4;
            final int maxHeightSize = parentHeight / 4;
    
            Random random = new Random();
    
            for(int i = 0; i < 50; i++) {
                int left = random.nextInt(parentWidth) - 10;
                int top = random.nextInt(parentHeight) - 10;
    
                int width = random.nextInt(maxWidthSize) + 10;
                int height = random.nextInt(maxHeightSize) + 10;
    
                ImageView child = new ImageView(this);
                child.setImageResource(R.drawable.ic_launcher);
                viewGroupImpl.addInScreen(child, left, top, width, height);
            }
    复制代码

    下面是效果图:

    展开全文
  • EJBJNDI使用源码例子 1个目标文件,JNDI使用例子,有源代码,可以下载参考,JNDI使用,初始化Context,它是连接JNDI树起始点,查找你要对象,打印找到对象,关闭Context…… ftp文件传输 2个目标文件...
  • EJBJNDI使用源码例子 1个目标文件,JNDI使用例子,有源代码,可以下载参考,JNDI使用,初始化Context,它是连接JNDI树起始点,查找你要对象,打印找到对象,关闭Context…… ftp文件传输 2个目标文件...
  • ExtAspNet_v2.3.2_dll

    2010-09-29 14:37:08
    -修正IE7下不能以下划线作为CSS类名前缀BUG(feedback:Steve.Wei)。 -添加定时器控件Timer,用来定时发起AJAX请求。 +2009-09-06 v2.1.0 -ButtonPressed属性值能够正确反映客户端变化。 -优化...
  • -修正IE7下不能以下划线作为CSS类名前缀BUG(feedback:Steve.Wei)。 -添加定时器控件Timer,用来定时发起AJAX请求。 +2009-09-06 v2.1.0 -ButtonPressed属性值能够正确反映客户端变化。 -优化...
  • 运行时行定制和数据机构—使用ExpressVerticalGrid,其最终用户可以按照他们的商业需要,使用简单的拖放功能来添加和删除行,以此来控制控件的外观。并可以轻而易举地创建新的数据分类。 为每一个VerticalGrid行添加...
  • [精仿]QQ2013局域网通讯(10.30更新版-带最新版界面库)

    千次下载 热门讨论 2013-11-02 16:18:45
    自定义系统按钮事件中可以 e.参数 来判断。 7.增加360安全卫士-DEMO案例。 8.增加SkinAnimatorImg控件,用于支持位图动画播放。如360动态logo。 9.各种细节BUG优化。 CC2013-10.11 1.添加SkinTabControlEx,加入...
  •  用JAVA开发一个小型目录监视系统,系统会每5秒自动扫描一次需要监视目录,可以用来监视目录文件大小及文件增减数目变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     用JAVA开发一个小型目录监视系统,系统会每5秒自动扫描一次需要监视目录,可以用来监视目录文件大小及文件增减数目变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
  • 了全面更新,介绍了最新开发环境和如何使用visual c++构建现实世界中的应用程序。拥有本书,您就迈向了通往使用两种c++版本编写应用程序成功之路,并成为一名优秀c++编程人 员。  主要内容  ·使用visual ...
  • 《visual c++ 2010入门经典(第5版)》针对visual c++ 2010版本进行了全面更新,介绍了最新开发环境和如何使用visual c++构建现实世界中的应用程序。拥有本书,您就迈向了通往使用两种c++版本编写应用程序成功之路...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    在窗口过程(WNDPROC)中可以对消息进行分析,对自己感兴趣消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。 3...

空空如也

空空如也

1 2 3
收藏数 44
精华内容 17
关键字:

以下控件中可以作为容器的控件的是