艺术Android查缺补漏(View篇)–自定义 View 的主导流程

02

慢慢的,我起来关注短发、简单干净之女生。到了初一情窦初开之年级,我同一目就看上了前排的一个女生,她虽然不是短发,但特别短马尾辫至少看起比较其它大部女生简单多矣,而且它丰富得不可开交彻底、清新。

随着我们聊越来越多,她仿佛代表了自身衷心中女神孙燕姿的身价,我对其逐渐有了近乎痴迷的眷顾——上课都盯住在它愣住。可女神有个旅特点——永远无法拥有,她最后选项了于我帅气的男生。

那段“伪失恋”状态不断了挺长远,期间心痛的落泪过几不善,只能拄看在孙燕姿的照片非常了及时段艰难——这为吃孙燕姿给自家的感受上了自我之不知不觉,我起来止关注短发、简单、可爱的女生了。

初二那年,在哥哥家玩的时段听到一首杀满意的歌曲,跑过去看来三总人口美女在电视机上帅气地跳舞,其中有个女性歌星拥有和孙燕姿同的短发看起似乎比孙燕姿还帅气,我的眼神也一直滞留在它们身上。突然,她拿温馨的服装破!掉!扔在地上继续唱唱——这同样动作根本失守了自己,女生本来好TM这么美!

它们虽这么将外套脱掉了!!!而且还依照于地上!!!我呆呆的大循环着MV看,知道了Superstar这篇歌唱,认识了S·H·E这个做,也了解了叫Ella的帅气女生!!!第二龙我飞去盗版影像店购买了S·H·E这张专辑,并盯在专辑封面的中等位置看了好久好久。

自身心头的女神变得愈具体——短发、帅气、有个性、利落。这几只标签不断以脑海里再,直到内化成了自己思想的等同组成部分。

否从定义View添加交互事件

03

回首自己于初一初始一直到死一追了之女生,她们到底平质量都是短发或短马尾,看起也都是帅气有个性的女生。也正好因这突出的选取,在感情上我跟樱木花道独一档——只有失败哪轮的上成功!

现沉思可能是我的性天生内敛,我想我认的人口足乐观活泼而不是比如说我同样。这点模糊的赞同在看孙燕姿那一刻为具化了,看到Ella的那么一刻增高了。这种对女性的感觉到不仅影响了本人对“美女”的概念跟另一半之选项,更影响了自的行为方式。

自潜意思里默认长发的女生传统和平静,这样的女生办事拖沓,可能还会见撒娇,粘人。而短发可爱之阴则反!在工作中我耶追求简单、直接与速,我烦繁杂的流水线,喜欢上问题本质。因此毕业后自己没考虑去国企、大商店面试,我喜爱简单的创业企业,这样我可小心让自家想和力量的升级,我愿意团结处理工作可以和孙燕姿、Ella一样干净利落、简洁有力!

自定义 View

打定义 View 的方法不断一种,可以一直接轨 View,重写 onDraw()
方法,也足以一直接轨
ViewGroup,还好继承现有的控件(如:TextView、LinearLayout)等,本篇主要介绍一下直接轨
View 的章程。

直接接轨 View 来促成从定义 View
的这种方法较灵活,可以兑现无数苛的成效,这种办法最要害的步骤就是是更写
onDraw() 方法,通过 Paint 画笔等工具在 Canvas
画布上拓展各种画的绘图以高达我们怀念如果的机能。

实际上以从定义 View
过程被,难点往往无是怎利用画笔本身,而是绘制有意料效益的笔触,例如:你想通过从定义
View
来举行一个折线图控件,传入一组数据怎么规定这些数据在画布上对应点的对立坐标,而规定点的坐标就得经过有关的数学公式来计量了,推算出合适的公式往往就是是缓解问题之要紧。

对接下去便用这种艺术来描写个周的有点 demo 来说明一下起定义 View 的流程。

  • 新建一个继往开来 View 的近乎,添加构造方法,设置 Paint 画笔,重写 onDraw()
    方法,先以画布上以最简易的计话一个半径为100底通盘。

/**
 * 自定义 View 简单示例
 * Created by liuwei on 17/12/14.
 */
public class MyView extends View {

    private final static String TAG = MyView.class.getSimpleName();

    private Paint mPaint = new Paint();
    private int mColor = Color.parseColor("#ff0000");

    public MyView(Context context) {
        super(context);
        Log.i(TAG, "MyView(Context context):content=" + context);
        init();
    }

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        Log.i(TAG, "MyView(Context context, @Nullable AttributeSet attrs):content=" + context + " | attrs=" + attrs);
        init();
    }

    private void init() {
        mPaint.setAntiAlias(true); // 消除锯齿
        mPaint.setColor(mColor); // 为画笔设置颜色
    }

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

        // 重写此方法,对自定义控件在 wrap_content 情况下设置默认宽、高
        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
        int heithtSpecSize = MeasureSpec.getSize(heightMeasureSpec);

        if (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(200, 200);
        } else if (widthSpecMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(200, heithtSpecSize);
        } else if (heightSpecMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(widthSpecSize, 200);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Log.i(TAG, "onDraw: ");
        super.onDraw(canvas);
        canvas.drawCircle(100, 100, 100, mPaint);
    }
}

运转结果就是是一个红色的热诚圆,在是示例中为教布局文件中之
wrap_content 正常生效,重写了 onMeasure()
方法,关于此题材,在这首博文《Android查缺补漏–自定义 View 中
wrap_content
无效的缓解方案》着吗介绍过了,这里就非多说了。

  • 将方的圆再扩展一下:做成以画布的可用区域的骨干也圆点,画有极充分的一应俱全。同时为打定义
    View 设置 padding
    对一个控件,有 margin 和 padding,margin
    是他间距,属于控件之外的限制,在起定义 View 时不需要针对 margin
    做特处理。但 padding
    就差了,是内距离,需要我们以控件的里做处理才能够于布局文件被针对控件设置的
    padding 生效。

private int mPaddingTop;
private int mPaddingBottom;
private int mPaddingLeft;
private int mPaddingRight;

private int mUsableWidth; // 可用宽度(减去padding后的宽度)
private int mUsableHeight;// 可用高度(减去padding后的高度)

private int mUsableStartX = 0; // 画笔起始点的x坐标
private int mUsableStartY = 0; // 画笔其实点的y坐标

private int mCircleX; // 圆心x坐标
private int mCircleY; // 圆心y坐标
private int mCircleRadius;// 圆的半径

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    mPaddingTop = getPaddingTop();
    mPaddingBottom = getPaddingBottom();
    mPaddingLeft = getPaddingLeft();
    mPaddingRight = getPaddingRight();

    // 可用宽度和宽度要考虑padding
    mUsableWidth = getWidth() - mPaddingRight - mPaddingLeft;
    mUsableHeight = getHeight() - mPaddingTop - mPaddingBottom;
    // 画笔起始点要考虑padding
    mUsableStartX = mPaddingLeft;
    mUsableStartY = mPaddingTop;

    // 确定可用区域的中心为圆心
    mCircleX = mUsableStartX + mUsableWidth / 2;
    mCircleY = mUsableStartY + mUsableHeight / 2;

    // 确定圆的半径,以可用宽度和高度两者较短的一半为圆的半径
    if (mUsableWidth <= mUsableHeight) {
        mCircleRadius = mUsableWidth / 2;
    } else {
        mCircleRadius = mUsableHeight / 2;
    }

    canvas.drawCircle(mCircleX, mCircleY, mCircleRadius, mPaint);
}

于布局文件中安 paddingLeft 为15dp,paddingRight
为30dp,为了更好看出间距,将控件的背景颜色要为黑色,查看效果:

<cn.codingblock.view.reset_view.MyView
        android:id="@+id/myview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:paddingLeft="15dp"
        android:paddingRight="30dp"
        android:background="#000"/>

效果图:
艺术 1

可见,在 onDraw()
方法对padding处理下,在布局文件被任怎么设置padding,都能够管圆心在可用区域之主导。

  • 呢从定义 View 添加自定义属性

第一在 res/values 路径下创办一个xml文件,添加一个安完善之颜料的性质:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyView">
        <attr name="circle_color" format="color"/>
    </declare-styleable>
</resources>

每当构造方法中解析属性

public MyView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    TypedArray typeArray = context.obtainStyledAttributes(attrs, R.styleable.MyView);
    mColor = typeArray.getColor(R.styleable.MyView_circle_color, mColor);
    typeArray.recycle();
    init();
}

说到底以布局文件被就是性就得了,要专注的凡,在采取自定义属性时一旦上加
xmlns:app=”http://schemas.android.com/apk/res-auto” 才可以。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="cn.codingblock.view.activity.MyViewActivity">

    <cn.codingblock.view.reset_view.MyView
        android:id="@+id/myview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:paddingLeft="15dp"
        android:paddingRight="30dp"
        app:circle_color="#ad42ce"
        android:background="#000"/>

</LinearLayout>

变动颜色后底功效图如下:
艺术 2

04

可自而庆幸那时候只有复读机,不至于被明星私存等八卦污染。这样孙燕姿和Ella给本人的觉得啊直接无变动,即使工作晚自己耶刻意避免自己失去搜寻她们的音,关注他们的存——有些觉得模糊就哼,没必要那么细节,关注细节或许会见被原本的觉得丧失,毕竟现在的传媒明星在何上厕所它还能够扒下!

表面的雕栏玉砌终究抵不了时光之痕迹,没有好的作品终究会叫时代遗忘。但异常幸运,孙燕姿以及自身的偶像周杰伦同到,他们是当真的艺术家,极具辨识力的动静配上永远优质的创作于她们的粉丝无论审美还是值选择都有大高之科班,换句话说孙燕姿和周杰伦是全民娱乐时代之“过滤器”。

孙燕姿看周杰伦演唱会

只是Ella就从不那么好,被迫听到很多有关其不好的音信,尤其是近年见到它们以有节目之长发造型。。。但好以女艺人孙燕姿一个就够了。

View是兼具控件的基类,包括Button、TextView、EditView等等都直接或间接接轨自view,View下面还有ViewGroup子类,即LinearLayout、RelativeLayout等还属于ViewGroup。

01

小学五年级的自身,第一蹩脚走上前贾明星卡片的小店,在多阴明星卡片中于唯一短发的女演员所掀起,买了其底同一仿照卡片——上面用复杂写在孙燕姿几单字。那时候的自家本着星不要概念,也从来不尽把其当回事,只看女生短发好好看的。

忘却了了了多久,一起陪同学购买明星卡片的当儿,突然见到旁边来个老伴贴画特别尴尬,拿起来细看更是爱不释手的不可开交,每张照片都那么来风味,那么来个性,原来女生短发真的足这样帅气和纯情。问了公寓主才知道中贴画里之人头吗是孙燕姿——但怎么和自身买的卡片了无像一个人口,果然盗版害人啊!

后我着迷上了孙燕姿,脑子里一直幻想:某平等上,一个诸如孙燕姿一样,有着短发、身材瘦瘦的女生陪在自家。从顾她贴画的那一刻,孙燕姿就改成了自我之女神。我拿孙燕姿的像贴满了书桌,还默默以语文和数学教材内页里吧贴了几乎摆——害怕别人看来说自“癞蛤蟆想吃天鹅肉”。上课无聊的当儿即便以出贴纸仔细斟酌,那些日子最高兴的事情实在看正在孙燕姿的相片对正值天空傻笑了。

咱俩用明白的凡当Android中,无论是View还是任何界面,右方向表示正在x轴的正向,下方向代表正y轴的正向。

05

娱乐圈的闻媒介可以影响我们的思想,进而影响我们的挑选,而挑选塑造了咱的人生。因此社会及主流明星的个人风格就特别重大,可今天“中性化”审美占据了主流,TFboys、鹿晗、吴亦凡、李易峰等外部更加女性的男明星成了咱的审美主流,而同一Angelababy、范冰冰、杨幂等富有古典美的女明星为改成了多男生择偶的正规化。

这些星还深有力量,喜欢她们也并随便针对错。但如果尽能影响年轻人的游玩领域为这些外部看起更为”复杂“的审美所把持,就会见导致更多口痴迷于外部要忽略一个人数的内在。再加上现在人口产生异常多之工具——微博、贴吧等体贴到一个影星的拥有八卦,这样明星为她们的不再是同一栽感觉而是同样栽实在,但明星吗是人数,也会见犯错,会于您去当初那么份起价的觉得!

即就是像笔友时代,见面意味着有幻想的一去不复返,只留下无趣的切切实实。但娱乐圈当是咱逃避现实的地方,不仅仅是为了单纯的放松自己,也是以通过暂停忙碌之做事以休闲享受着找到心灵之那份感动——就比如每次听周杰伦以及孙燕姿新歌唱之时光都于了自己追卓越的动力,毕竟我们的大脑在复苏之下最好有创造力,也再也会收周围的感想从而有更多的本身认知。学会跟偶像保持“距离”很重大!

不过实际是社会变得尤为浮躁,成为公民偶像的门径越来越低,再长有点明星自身不点,这样针对性年轻一代的成才大不利于。年长一代应该关心青少年选择的偶像,在可以干预的最初还可能被他俩接触古典乐,到了小学阶段可以叫他们点周杰伦、王力宏、孙燕姿这些上的偶像之创作。让儿女维持与偶像的“距离”很不便,毕竟网络太过便捷,既然每个人还喜欢找自己的偶像,为什么不叫儿女寻找这些几乎毫无黑点的正能量明星为?

故了苹果的手机的食指重为转不至安卓,听了他们歌曲的人数吗再度为束手无策经受低品位作品,因此接触事物的顺序很重点,优先接触劣质作品若起从的选标准会降低他们针对自己卓越之要求,满足吃小档次成功。

故而,这一切都是孙燕姿的擦,让自家于当下“操蛋”的社会里孤独地坚守在心中之“天真”——梦想正发同等龙能把刚价值传递给世界!

ScaleGestureDetector 缩放手指检测

除开上面最常见的 MotionEvent 事件外,Android
还提供了过多好玩之风波,就想
GestureDetector(手势检测)、VelocityTracker(速度追踪)等等,用起也都格外方便,其实只要你愿意,这些事件吧完全可于
onTouchEvent() 方法被实现,接下去当啊上述的圈 Demo
添加一个缩放的作用,也就算是采取 ScaleGestureDetector
实现,效果以及平常当手机查看照片时我们用简单绝望手指来放大/缩小图片相同。

ScaleGestureDetector
在行使起来也充分简短,首先需初始化并为那长一个放缩手势监听器,并且需要在
onTouchEvent() 方法内,通过 ScaleGestureDetector.onTouchEvent(event)
来深受 ScaleGestureDetector 接管触摸事件,其余的事项要留心看代码中之诠释。

当上述代码的根基及增产如下代码:

private Context mContext;
private ScaleGestureDetector mScaleGestureDetector; // 缩放手势检测
private float mScaleRate = 1; // 缩放比率

private void init() {
    mPaint.setAntiAlias(true); // 消除锯齿
    mPaint.setColor(mColor); // 为画笔设置颜色
    // 初始化 ScaleGestureDetector 并添加缩放手势监听器
    mScaleGestureDetector = new ScaleGestureDetector(mContext, mOnScaleGestureListener);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    mPaddingTop = getPaddingTop();
    mPaddingBottom = getPaddingBottom();
    mPaddingLeft = getPaddingLeft();
    mPaddingRight = getPaddingRight();

    // 可用宽度和宽度要考虑padding
    mUsableWidth = getWidth() - mPaddingRight - mPaddingLeft;
    mUsableHeight = getHeight() - mPaddingTop - mPaddingBottom;
    // 画笔起始点要考虑padding
    mUsableStartX = mPaddingLeft;
    mUsableStartY = mPaddingTop;

    // 确定可用区域的中心为圆心
    mCircleX = mUsableStartX + mUsableWidth / 2;
    mCircleY = mUsableStartY + mUsableHeight / 2;

    // 确定圆的半径,以可用宽度和高度两者较短的一半为圆的半径
    if (mUsableWidth <= mUsableHeight) {
        mCircleRadius = mUsableWidth / 2;
    } else {
        mCircleRadius = mUsableHeight / 2;
    }

    // 让半径乘以缩放倍率
    mCircleRadius *= mScaleRate;
    canvas.drawCircle(mCircleX, mCircleY, mCircleRadius, mPaint);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mColor = mColors[mRandom.nextInt(6)];
            mPaint.setColor(mColor);
            invalidate(); // 通知控件重绘
            break;
        case MotionEvent.ACTION_UP:
            Log.i(TAG, "onTouchEvent: ACTION_UP");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.i(TAG, "onTouchEvent: ACTION_MOVE");
            break;
    }

    // 让缩放手势检测器接管触摸事件
    if (mScaleGestureDetector.onTouchEvent(event)) {
        return true;
    }

    return super.onTouchEvent(event);
}

private ScaleGestureDetector.OnScaleGestureListener mOnScaleGestureListener = new ScaleGestureDetector.OnScaleGestureListener() {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        Log.i(TAG, "onScale: " + detector.getScaleFactor());
        // 获取缩放比例因子并累乘到缩放倍率上
        mScaleRate *= detector.getScaleFactor();
        postInvalidate();
        return true;
    }

    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        Log.i(TAG, "onScaleBegin: " + detector.getScaleFactor());
        return true;
    }

    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {
        Log.i(TAG, "onScaleEnd: " + detector.getScaleFactor());
    }
};

艺术 3

上面代码用留意的凡,在 ScaleGestureDetector
捕获到事件后使正确的将事件消费掉(注意代码中回到 true
的地方),不然缩放手势无法正常工作。

打定义 View 在 Android
中直接以来还是坏重要之均等组成部分,在平时的支付想要做出一个个性炫酷的并行界面是离不上马于定义
View,自定义 View
说难不为难,说简练也非略,总之,千里的实践,始于足下,只要我们掌握好于定义
View 的基础知识,再复杂的界面也得一步步得。


终极想说之凡,本系列文章也博主对Android知识展开重新梳理,查缺补漏之求学过程,一方面是针对性团结忘记的东西加以复习重新掌握,另一方面相信在重新学习的过程中肯定会产生巨大的新取得,如果您啊生同自家同一的想法,不妨关心自我伙读书,互相探讨,共同进步!

参考文献:

  • 《Android开发方探索》
  • 《Android开发进阶从小工到专家》

一个演唱者是怎培养我们的审美的

咱的审美无发现中会蒙自己热爱的歌手影响,TA们养了咱的审美,进而改变我们打社会风气接到知识之限制,最终影响我们的沉思方法。

欣赏鹿晗、吴亦凡的女生好或男友的外表也是即时类“中性化”。而爱孙燕姿、ELLA的男生就是会见变换得及本身平,更期待团结的其他一半不胜简单、干练。

今天当网易云音乐上张了孙燕姿时隔四年之初专辑,毫不犹豫花15请了一样张,第一首歌《风衣》就于自家痴迷,这么多年了其的歌曲还会见非常这么好听,那个起磁性的音响近乎自己仍青春。当然比歌曲吸引自己的凡特辑封面——简单吃露着性感,我承认自己凝视在当时张相片看了那个遥远很遥远,还管它们下载保存到手机里。

MotionEvent 触摸事件

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.i(TAG, "onTouchEvent: ACTION_DOWN");
            break;
        case MotionEvent.ACTION_UP:
            Log.i(TAG, "onTouchEvent: ACTION_UP");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.i(TAG, "onTouchEvent: ACTION_MOVE");
            break;
    }
    return super.onTouchEvent(event);
}

于由定义 View 中,重写 onTouchEvent() 方法,获取
MotionEvent,正使上面代码所勾画,MotionEvent 比较常用的风波有三种植
ACTION_DOWN、ACTION_MOVE、ACTION_UP 分别对诺指按下-移动-离开。

紧接下去对点的旋demo添加一个小事件,就是以手指点击一下屏幕,圆形就轻易换一栽颜色:

private Random mRandom = new Random(100);
private int[] mColors = new int[] {
  Color.parseColor("#ff0000"),
  Color.parseColor("#ffffff"),
  Color.parseColor("#ff00ff"),
  Color.parseColor("#ffff00"),
  Color.parseColor("#ff00ff"),
  Color.parseColor("#0000ff")
};

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mColor = mColors[mRandom.nextInt(6)];
            mPaint.setColor(mColor);
            invalidate(); // 通知控件重绘
            break;
        case MotionEvent.ACTION_UP:
            Log.i(TAG, "onTouchEvent: ACTION_UP");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.i(TAG, "onTouchEvent: ACTION_MOVE");
            break;
    }
    return super.onTouchEvent(event);
}

效能如下:
艺术 4

大家吧得于此基础及小重扩展一下,例如:通过 event.getX() 和
event.getY()
获取触摸点的坐标,判断出点是否取得于了周区域外,从而使只生硌手指点到周区域外才转颜色,否则不改。感兴趣的童鞋可自动动手试一试行。

于上面代码中通报 View 重绘时使用了 invalidate() 方法,其实
postInvalidate() 也足以通报 View 重绘,那么这点儿吧生什么分别吗?

事实上简单的话,invalidate() 只能够在 UI 线程中采用,而 postInvalidate()
可以于子线程中运用。

View是Android很关键之一致部分,常用的View有Button、TextView、EditView、ListView、GridView、各种layout等等,开发者通过对这些View的各种组合以形成丰富多彩的彼此界面,一个以被界面交互的感受往往以行使之于欢迎程度上由了怪要紧得作用,所以开发者们大都会设法的做出一个更为良好之界面,例如:通过自定义View、深入学习View的规律以便更好之对准该优化使该在操作起来更加通畅等等,也刚缘这样,在面试中View也时作为面试官重点考察之靶子之一。

View 的中心工作规律

在 ActivityThread 中,当Activity被创造后会用 DecorView 添加到 Window
中,同时创造 ViewRootImpl 对象,并以 ViewRootImpl 和 DecorView
建立关联,而 DecorView 就是一个 Activity 的头等
View,在一个默认的主题中,它分为标题栏,和情节区域,我们所增长的 View
均是长到了 DecorView 的内容区域,这些吃补加进去的 View
的做事流程专业通过 ViewRootImpl 完成的。

ViewRoot、DecorView 及 View 的老三老大流程简介:

  • ViewRoot:对应于 ViewRootImpl,链接 WindowManager 和 DecorView
    的关键,View 的老三很流程都是经她好的。(View 的绘图流程是由
    ViewRoot 的 performTraversals() 方法开始之,它经过
    measure、layout、draw 三单流程最终才能够用一个 View 完整的绘图出。)

  • DecorView:新建一个 Android
    应用时我们且清楚,默认主题的状态下这个利用的界面会分为两组成部分:标题栏、内容区域。而此界面的头等
    View 就是 DecorView。

  • View的绘图经过了 measure、layout、draw 三个流程:

  • measure:对应 onMeasure() 方法,测量View的宽、高。

  • layout:对应 onLayout()
    方法,确定view的季只极点,即确定View在父容器中的职位。
  • draw:对应 onDraw(),绘制View。在由定义 View 时我们为多亏在 onDraw()
    方法内可以以 Canvas 画布上恣意的写生我们怀念如果的 View。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图