关闭

安卓View开发心得(三)

标签: android应用androidView
284人阅读 评论(0) 收藏 举报
onLayout (boolean changed, int left,int top,int right,int bottom)
Called from layout when this view should assign a size and position to each of its children. Derived classes with children should override this method and call layout on each of their children.
layout (int l, int t, int r, int b)
Assign a size and position to a view and all of its descendants
This is the second phase of the layout mechanism. (The first is measuring). In this phase, each parent calls layout on all of its children to position them. This is typically done using the child measurements that were stored in the measure pass().
Derived classes should not override this method. Derived classes with children should override onLayout. In that method, they should call layout on each of their children.
先看看View的layout/onLayout:layout()非final,意味着子类是可以随便重写,在方法中调用自身的onLayout()。onLayout()是一个空方法,没有做任何事情。再看ViewGroup:
@Override
public final void layout(int l, int t, int r, int b) {
    if (!mSuppressLayout && (mTransition == null || !mTransition.isChangingLayout())) {
        if (mTransition != null) {
            mTransition.layoutChange(this);
        }
        super.layout(l, t, r, b);
    } else {
        // record the fact that we noop'd it; request layout when transition finishes
        mLayoutCalledWhileSuppressed = true;
    }
}
@Override
protected abstract void onLayout(boolean changed,
        int l, int t, int r, int b);
ViewGroup的layout调用了父类的layout,onLayout则直接定义成了抽象方法,要求ViewGroup的子类必须实现onLayout,以对child view进行layout。从RelativeLayout.onLayout()可以看到对child view的layout操作:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    //  The layout has actually already been performed and the positions
    //  cached.  Apply the cached values to the children.
    final int count = getChildCount();

    for (int i = 0; i < count; i++) {
        View child = getChildAt(i);
        if (child.getVisibility() != GONE) {
            RelativeLayout.LayoutParams st =
                    (RelativeLayout.LayoutParams) child.getLayoutParams();
            child.layout(st.mLeft, st.mTop, st.mRight, st.mBottom);
        }
    }
}
所以,parent view和child view的layout过程的迭代调用关系同measure。
总结下来,关于在自己开发的View中使用onLayout()需要注意:
(1)自定义的ViewGroup,需要实现onLayout,并且必须在其中对child view进行layout。

void onDraw (Canvas canvas)
Implement this to do your drawing.
void draw (Canvas canvas)
Manually render this view (and all of its children) to the given Canvas. The view must have already done a full layout before this function is called. When implementing a view, implement onDraw(android.graphics.Canvas) instead of overriding this method. If you do need to override this method, call the superclass version.
第三阶段draw,从官方文档可以看到,虽然View.draw()方法没有设计成final,即给继承者留下了重写的空间,但明确要求必须手动调用super.draw()。将扩展性放到了onDraw中。View.onDraw()没有做任何事。
再看看TextView,没有重写draw(),但onDraw()比较复杂,约170行。ViewGroup/RelativeLayout都没有重写draw()和onDraw()。
draw涉及到View的一个概念:drawing order(z order)。视觉效果上,child view在parent view的前面(上面)显示;在一个RelativeLayout中,同样位置位于更后面定义的chid view显示在前面(上面),都与z order有关。通过接口setZ(float)可以修改z order。
总结下来,关于在自己开发的View中使用onDraw()需要注意:
(1)与measure和layout相比较,draw更关注于View的展示内容,所以在动画的处理上,onDraw的使用更多。
(2)对于ViewGroup,并不需要在onDraw中处理child view的draw相关的逻辑,onDraw只需要关注自身的绘制。

如上,三个过程都写完了,那么,除了手动调用measure()/layout()/draw(),还有什么办法可以手动触发View的生命周期呢?安卓提供如下api:
(1)requestLayout():触发measure-layout。
(2)invalidate():强制draw。


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

安卓View开发心得(一)

安卓View相关的api是安卓最重要的api之一。对于一个第三方app来说,UI是很重要的一部分。一个app工程,一般都包含UI、业务逻辑(含与网络接口相关的逻辑)、数据库等。UI是脸面,UI上的bug一眼就能被用户看到,马虎不得。UI做的是否精细,也体现了对用户的交代。这个app烂大街的时代,如果...
  • aliankg
  • aliankg
  • 2016-05-26 16:40
  • 1336

Android开发心得(一)

Android开发心得之MVC这一个学期在上潘老师的系统设计与分析课程时,我们小组开发了基于安卓平台的电影购票软件。在开发过程中收获了挺多,现在在课程结束前,把其分享出来。 MVC是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Contro...
  • a1054513777
  • a1054513777
  • 2017-06-10 21:02
  • 324

最近用android写的一个项目,开发心得

学习android半年多了,除了之前用cocos2d-android-1写了一个简单的猜成语游戏及一款基于讯飞语音应用外,之后都是零零碎碎的做一些小的案例,没有正在写一个全的应用。最近发现自己用手机传文件很不方便,于是就想自己开发一个android系统下无线文件传输应用(当然了应用商城上也有相关应用...
  • zhaochengsheng
  • zhaochengsheng
  • 2015-05-24 23:40
  • 1197

安卓View开发心得(二)

2.善于利用“生命周期” 安卓VIew生命周期是面向对象设计模式中“模板方法模式”的一个经典应用。由系统服务(AMS、WMS等)维护View的生命周期,这些View的生命周期的细节app开发者可以不必了解,只需要知道一些关键的逻辑节点;这些关键的逻辑节点以关键的类似onXXX()方法的方式存在,...
  • aliankg
  • aliankg
  • 2016-05-27 11:44
  • 252

Android自定义View 一<最简单的自定义View>

为什么要自定义Viewandroid提供了很多控件供我们使用 但有些功能是系统所提供的实现不 了的 这时候我们就需要自定义一个View来实现我们所需要的效果. 在Android中所有的控件都直接或间接的继承自View,分View和ViewGroup两部分. 我们常用的一些View比如T...
  • qq_36209474
  • qq_36209474
  • 2017-03-19 15:39
  • 654

一个三年Android开发的总结-开篇

一个三年Android开发的总结-开篇 转眼间全职从事Android开发已有三年,想把这一阶段的积累总结记录并展现出来,作为Android开发必备的知识,希望对有一定Android开发基础的人进阶有裨益,倘若能让一些人少走些弯路,也算作是我做的一件有意义的事情。如果其中有不足或疏漏之处,还请指出,...
  • w7849516230
  • w7849516230
  • 2016-03-13 23:10
  • 13461

IOS、安卓IM语音聊天开发初探部分心得——网络基础篇

今儿是个还债的日子,没错,承诺了许久的网络传输篇虽然没有千呼万唤,不过我还是厚着脸皮始出来,继上两篇文章总结了一下开发IM语音功能时所遇到的音频问题,而今天就让我们来看看这个让我们看似近在眼前,确始终犹抱琵琶半遮面的网络传输吧~不过在开始我先要提醒一下诸位看官,我们的本章的内容中只是介绍网络的基础只...
  • ALDRIDGE1
  • ALDRIDGE1
  • 2014-01-12 00:17
  • 2577

android与HTML混合开发总结

现在很多的 APP中会嵌套HTML5的页面,比如经常变化的等等,有一部分页面需要原生Java与HTML5中的js进行交互操作,下面介绍一下android中HTML5的使用: 1、关于HTML5种cookie   网页中可能会用到 用户信息等很多参数,可以提前把这些信息放到cookie中,...
  • hunhun1122
  • hunhun1122
  • 2017-02-04 16:03
  • 1952

安卓开发心得(二)

Android开发心得之委托者模式这一个学期在上潘老师的系统设计与分析课程时,我们小组开发了基于安卓平台的电影购票软件。在开发过程中收获了挺多,现在在课程结束前,把其分享出来。 委托者模式是软件设计模式中的一项基本技巧。1.什么是委托者模式? 委托模式是软件设计模式中的一项基本技巧。在委托模式...
  • a1054513777
  • a1054513777
  • 2017-06-11 13:57
  • 158

安卓开发自定义View

1.自定义View 虽然Android提供了很多继承了View类的UI组件,但是在实际开发时,还会出现不足以满足程序需要的情况。这时用户就可以通过继承View类来开发自己的组件。开发自定义View组件的主要步骤如下: (1)创建一个继承android.view.View类的View类,并且重写构...
  • king_zxy
  • king_zxy
  • 2017-02-15 19:33
  • 85
    个人资料
    • 访问:85111次
    • 积分:1854
    • 等级:
    • 排名:千里之外
    • 原创:101篇
    • 转载:1篇
    • 译文:0篇
    • 评论:23条
    最新评论