当前位置: 首页 > news >正文

网站建设哪家内衣网站建设推广

网站建设哪家,内衣网站建设推广,制作一个网站多少钱啊,电视直播网站怎么做一、UI如何进行具体绘制 UI从数据加载到具体展现的过程#xff1a; 进程间的启动协作#xff1a; 二、如何加载到数据 应用从启动到onCreate的过程#xff1a; Activity生产过程详解#xff1a; 核心对象 绘制流程源码路径 1、Activity加载ViewRootImpl ActivityThread…一、UI如何进行具体绘制 UI从数据加载到具体展现的过程 进程间的启动协作 二、如何加载到数据 应用从启动到onCreate的过程 Activity生产过程详解 核心对象 绘制流程源码路径 1、Activity加载ViewRootImpl ActivityThread.handleResumeActivity() -- WindowManagerImpl.addView(decorView, layoutParams) -- WindowManagerGlobal.addView()2、ViewRootImpl启动View树的遍历 ViewRootImpl.setView(decorView, layoutParams, parentView) --ViewRootImpl.requestLayout() --scheduleTraversals() --TraversalRunnable.run() --doTraversal() --performTraversals()performMeasure、performLayout、performDraw二、View绘制流程 1、measure 1MeasureSpec是什么 重写过onMeasure()方法都知道测量需要用到MeasureSpec类获取View的测量模式和大小那么这个类是怎样存储这两个信息呢 留心观察的话会发现onMeasure方法的两个参数实际是32位int类型数据即 00 000000 00000000 00000000 00000000 而其结构为 mode size 前2位为mode而后30位为size。 getMode()方法measureSpec -- mode private static final int MODE_SHIFT 30; // 0x3转换为二进制即为11 // 左移30位后11000000 00000000 00000000 00000000 private static final int MODE_MASK 0x3 MODE_SHIFT;public static int getMode(int measureSpec) {// 与MODE_MASK按位与运算后即将低30位清零结果为mode左移30位后的值return (measureSpec MODE_MASK); }getSize()方法同理。 makeMeasureSpec()方法mode size -- measureSpec public static int makeMeasureSpec(IntRange(from 0,to (1 MeasureSpec.MODE_SHIFT) - 1) int size,MeasureSpecMode int mode) {if (sUseBrokenMakeMeasureSpec) {return size mode;} else {return (size ~MODE_MASK) | (mode MODE_MASK);} }这里解释一下按位或左侧为size的高2位清零后的结果右侧为mode的低30位清零后的结果两者按位或运算的结果正好为高2位mode、低30位size例 01000000 00000000 00000000 00000000 | 00001000 00001011 11110101 10101101 01001000 00001011 11110101 10101101测量模式 public static final int UNSPECIFIED 0 MODE_SHIFT; public static final int EXACTLY 1 MODE_SHIFT; public static final int AT_MOST 2 MODE_SHIFT;UNSPECIFIED父容器不对View作任何限制系统内部使用。 EXACTLY精确模式父容器检测出View大小即为SpecSize对应LayoutParams中的match_parent和指定大小的情况。 AT_MOST最大模式父容器指定可用大小View的大小不能超出这个值对应wrap_content。 2ViewGroup的测量流程 回到ViewRootImpl的performMeasure方法这里传入的参数为顶层DecorView的测量规格其测量方式为 private static int getRootMeasureSpec(int windowSize, int rootDimension) {int measureSpec;switch (rootDimension) {case ViewGroup.LayoutParams.MATCH_PARENT:measureSpec MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY);break;case ViewGroup.LayoutParams.WRAP_CONTENT:measureSpec MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST);break;default:measureSpec MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY);break;}return measureSpec; }match_parent和具体数值大小为EXACTLY模式wrap_content则为AT_MOST模式。 往下走performMeasure方法中调用了DecorView的onMeasure方法而DecorView继承自FrameLayout可以看到FL的onMeasure方法中调用了measureChildWithMargins方法并传入自身的测量规格 protected void measureChildWithMargins(View child,int parentWidthMeasureSpec, int widthUsed,int parentHeightMeasureSpec, int heightUsed) {final MarginLayoutParams lp (MarginLayoutParams) child.getLayoutParams();final int childWidthMeasureSpec getChildMeasureSpec(parentWidthMeasureSpec,mPaddingLeft mPaddingRight lp.leftMargin lp.rightMargin widthUsed, lp.width);final int childHeightMeasureSpec getChildMeasureSpec(parentHeightMeasureSpec,mPaddingTop mPaddingBottom lp.topMargin lp.bottomMargin heightUsed, lp.height);child.measure(childWidthMeasureSpec, childHeightMeasureSpec); }即测量子控件的大小测量规则详情可看getChildMeasureSpec方法总结如下 childLayoutParams\parentSpecModeEXACTLYAT_MOSTUNSPECIFIEDdpEXACTLY/childSizeEXACTLY/childSizeEXCATLY/childSizematch_parentEXACTLY/parentSizeAT_MOST/parentSizeUNSPECIFIED/0wrap_contentAT_MOST/parentSizeAT_MOST/parentSizeUNSPECIFIED/0 回到onMeasure方法测完子控件之后ViewGroup会经过一些计算得出自身大小 // 加上padding maxWidth getPaddingLeftWithForeground() getPaddingRightWithForeground(); maxHeight getPaddingTopWithForeground() getPaddingBottomWithForeground();// 检查是否小于最小宽度、最小高度 maxHeight Math.max(maxHeight, getSuggestedMinimumHeight()); maxWidth Math.max(maxWidth, getSuggestedMinimumWidth());// 检查Drawable的最小高度和宽度 final Drawable drawable getForeground(); if (drawable ! null) {maxHeight Math.max(maxHeight, drawable.getMinimumHeight());maxWidth Math.max(maxWidth, drawable.getMinimumWidth()); }setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),resolveSizeAndState(maxHeight, heightMeasureSpec,childState MEASURED_HEIGHT_STATE_SHIFT));综上ViewGroup的测量需要先测量子View的大小而后结合padding等属性计算得出自身大小。 3View的测量流程 View.performMeasure() --onMeasure(int widthMeasureSpec, int heightMeasureSpec) --setMeasuredDimension(int measuredWidth, int measuredHeight) --setMeasuredDimensionRaw(int measuredWidth, int measuredHeight)可以看到setMeasuredDimensionRaw()方法 private void setMeasuredDimensionRaw(int measuredWidth, int measuredHeight) {// 存储测量结果mMeasuredWidth measuredWidth;mMeasuredHeight measuredHeight;// 设置测量完成的标志位mPrivateFlags | PFLAG_MEASURED_DIMENSION_SET; }View不需要考虑子View的大小根据内容测量得出自身大小即可。 另外View中的onMeasure方法中调用到getDefaultSize方法 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec)); }public static int getDefaultSize(int size, int measureSpec) {int result size;int specMode MeasureSpec.getMode(measureSpec);int specSize MeasureSpec.getSize(measureSpec);switch (specMode) {case MeasureSpec.UNSPECIFIED:result size;break;case MeasureSpec.AT_MOST:case MeasureSpec.EXACTLY:// 最终测量的结果都是父容器的大小result specSize;break;}return result; }这里看到精确模式和最大模式最终测量的结果都是父容器的大小即布局中的wrap_content、match_parent以及数值大小效果都一样这也就是自定义View一定要重写onMeasure方法的原因。 2、layout 布局相对测量而言要简单许多从ViewRootImpl的performLayout方法出发可以看到其中调用了DecorView的layout方法 // 实则为DecorView的left, top, right, bottom四个信息 host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());进入layout方法发现l、t、r、b被传递到了setFrame方法中并设置给了成员变量 mLeft left; mTop top; mRight right; mBottom bottom;所以布局实际为调用View的layout方法设置自身的l、t、r、b值。另外layout方法中往下走可以看到调用了onLayout方法进入后发现为空方法。因而查看FrameLayout的onLayout方法 Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) {layoutChildren(left, top, right, bottom, false /* no force left gravity */); }void layoutChildren(int left, int top, int right, int bottom, boolean forceLeftGravity) {final int count getChildCount();// 省略for (int i 0; i count; i) {final View child getChildAt(i);if (child.getVisibility() ! GONE) {final LayoutParams lp (LayoutParams) child.getLayoutParams();// 省略child.layout(childLeft, childTop, childLeft width, childTop height);}} }可以看到进行一系列计算后调用了child的layout方法对子控件进行布局同时子控件又会继续往下对自己的子控件布局从而实现遍历。 综上布局实际为调用layout方法设置View位置ViewGroup则需要另外实现onLayout方法摆放子控件。 3、draw 1绘制过程入口 ViewRootImpl.performDraw() --ViewRootImpl.draw() --ViewRootImpl.drawSoftware() --View.draw()2绘制步骤 进入到View的draw方法中可以看到以下一段注释 /** Draw traversal performs several drawing steps which must be executed* in the appropriate order:** 1. Draw the background* 2. If necessary, save the canvas layers to prepare for fading* 3. Draw views content* 4. Draw children* 5. If necessary, draw the fading edges and restore layers* 6. Draw decorations (scrollbars for instance)*/以上就是Android开发中的UI绘制原理及过程实现更多技术探讨可进入查看《Android核心技术手册》进行学习。 最后 结合draw方法的源码绘制过程的关键步骤如下 绘制背景drawBackground(canvas) 绘制自己onDraw(canvas) 绘制子viewdispatchDraw(canvas) 绘制滚动条、前景等装饰onDrawForeground(canvas)
http://www.dnsts.com.cn/news/210030.html

相关文章:

  • 教务在线网站开发报告书网络设计专业学什么
  • 网站建设合同付款比例永湖网站建设
  • 公司做网站域名的好处设计坞在线海报制作
  • 淘宝数据分析工具seo兼职工资一般多少
  • 宁波网站营销推广制作怎样查询网站建设时间
  • 外贸建站主机魏县手机网站建设
  • 开关网站建设导航页面wordpress代码
  • 网上做外贸都有哪些网站wordpress美文主题
  • 电子商务网站建设课程心得免费建站建站
  • 建站房的公司公司网站怎么优化
  • 关于网站建设的请示范文个体营业执照怎么年审
  • 淘宝客网站做一种还是做好几种上海网站制作上海网站制作
  • 温州建设银行网站个人网站备案查询
  • 巴中做网站的公司家具网站建设目的及功能定位
  • 姜堰区网站建设wordpress初始设置
  • 如何利用ftp上传网站树莓派上怎么做网站
  • 广州比较好的网站建设烟台58同城网站建设
  • 服饰技术支持 东莞网站建设软件企业公司网站模板下载
  • 麦包包网站建设的特点wordpress载入等待
  • 响应网站网站建设教程要去d湖南岚鸿询 问
  • 金华集团网站建设免费空间的个人网站
  • 起飞页自助建站平台的特点icp备案网站负责人
  • 查询数据的网站怎么做的整个网站建设中的关键步骤是
  • 我的世界服务器如何做充钱网站室内设计师网名专用
  • 公司网站服务器租用个人网站免费空间
  • 适合做外链的网站门户网站制作哪专业
  • 网站添加缩略图wordpress grace 破解
  • 网站建设与管理专业就业前景北京网站优化站优化
  • 尚品中国网站网页布局方式
  • 中山市饮食网站建设网站技术解决方案不包括