在上一章节Android 面试题总结之Android 基础ListView(五) 主要是ListView的优化,原理以及一些基本问题。java
在阅读过程当中有任何问题,请及时联系。如需转载请注明 fuchenxuan de Blog
本章系《Android 之美 从0到1 – 高手之路》Android基础将会总结了Android 布局常见面试问题。其实对于基础方面Android 开发来讲,常常面试无非就是UI,网络,数据库,这三大方面,本章节总结了笔记经典的问题,但愿对广大Android 开发者,有所帮助。 android
谈谈 UI 中, Padding 和 Margin 有什么区别?面试
android:padding 和 android:layout_margin 的区别,其实概念很简单,padding 是站在父 view 的角度描述问 题,它规定它里面的内容必须与这个父 view 边界的距离。margin 则是站在本身的角度描述问题,规定本身和其余(上下左右)的 view 之间的距离,若是同一级只有一个 view,那么它的效果基本上就和 padding 同样了。算法
hierarchyviewer
工具分析视图树,帮助咱们发现没有用到的布局。 <include>
标签复用相同的布局代码 <merge>
标签减小视图层次结构 Include
或者 ViewStub
标签从外部导入 xml 结构时,能够将被导入的 xml 用 merge 做为根节 点表示,这样当被嵌入父级结构中后能够很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。 <merge>
只能做为 xml 布局的根元素。 <ViewStub>
实现 View 的延迟加载android:layout_gravity 和 android:gravity 的区别?
第一个是让该布局在其父控件中的布局方式,第二个是该布局布置其字对象的布局方式。数据库
关于LinearLayout 的权重算法? 性能优化
<LinearLayout android:layout_width="210dp" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="30dp" android:layout_height="40dp" android:layout_weight="1" android:text="button1" /> <Button android:layout_width="30dp" android:layout_height="40dp" android:layout_weight="1" android:text="button2" /> <Button android:layout_width="30dp" android:layout_height="40dp" android:layout_weight="2" android:text="button3" /> </LinearLayout>
如上代码,如何计算出每个Button的宽度?markdown
布局大小=剩余空间大小权重所占比例+设定的宽度网络
scrollView 嵌套 listview 方式除了测量还有什么方法?架构
dp 和 px 之间的关系?
dp:是 dip 的简写,指密度无关的像素。 指一个抽象意义上的像素,程序用它来定义界面元素。一个与密度无关的,在逻辑尺寸上,与一个位于像素密度为 160dpi 的屏幕上的像素是一致的。 要把密度无关像素转换为屏幕像素,能够用这样一个简单的公式: pixels=dips*(density/160)。举个例子,在 DPI 为 240 的屏幕上,1 个 DIP 等 于 1.5 个物理像素。
布局时最好使用 dp 来定义咱们程序的界面,由于这样能够保证咱们的 UI 在各类分辨率的屏幕上均可以正常显示。app
/** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * 根据手机的分辨率从 dip 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); }
因而乎,应该也能理解android项目中的图片资源文件,通常咱们须要在如下几个文件夹中提供不一样大小的图片。
什么是屏幕尺寸、屏幕分辨率、屏幕像素密度?
屏幕尺寸是指屏幕对角线的长度。单位是英寸,1英寸=2.54厘米
屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1像素点,通常是纵向像素横向像素,如1280×720
屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写,像素密度和屏幕尺寸和屏幕分辨率有关。
Android 样式和主题?
样式(Styles):
Android 容许在外部样式文件中定义 Android 应用程序的 Look 和 Feel ,你能够将定义好的样式应用在不一样的视图(Views)上。你能够在 XML 文件中定义样式,并将这些样式运用到不一样的组件上。使用XML这种方式定义样式,你只须要配置一些通用的属性,之后若是须要修改样式,能够集中修改。
属性(Attributes):
你也能够将单个属性应用到 Android 样式上,一般会在自定义View 的时候,自定义属性。
主题(Themes):
主题相比单个视图而言,是应用到整个 Activity 或者 application 的样式
如何将Acitivity中的Window的背景图设置为空?
getWindow().setBackgroundDrawable(null);android的默认背景是否是为空。
在明白上面基础问题的一些基本概念后,这里总结了一些布局适配的经验。
在Android 中 有4种广泛尺寸:小(small),普通(normal),大(large),超大(xlarge)
常见的广泛分辨率: 低精度(ldpi), 中精度(mdpi), 高精度(hdpi), 超高精度(xhdpi) 1080P(xxhdpi)
基本设置
在中Menifest中添加子元素
android:anyDensity=”true”时,应用程序安装在不一样密度的终端上时,程序会分别加载xxhdpi、xhdpi、hdpi、mdpi、ldpi文件夹中的资源。
相反,若是设为false,即便在文件夹下拥有相同资源,应用不会自动地去相应文件夹下寻找资源
适配方案:
使用相对布局,禁用绝对布局
建立不一样的layout:每一种layout须要保存在相应的资源目录中,目录以-为后缀命名。例如,对大尺寸屏幕(large screens),一个惟一的layout文件应该保存在res/layout-large/中。
Drawable属于轻量级的、使用也很简单,Android把可绘制的对象抽象为Drawable,不一样的图形图像资源就表明着不一样的drawable类型, 在实际的开发过程当中使用@drawable
来使用drawable资源。关于Drawable更多的请看下图
Android 5.0 新特性–使用SVG图片资源
SVG的全称是Scalable Vector Graphics,叫可缩放矢量图形。它和位图(Bitmap)相对,SVG不会像位图同样由于缩放而让图片质量降低。
优势:
* 图片的完美适配。SVG 图像在放大或改变尺寸的状况下其图形质量不会有所损失。这样咱们大大减小了适配所须要的多种分辨率图片,并且可以让图片完美适配多种分辨率,减小了APK包大小并提高了用户体验。
* 尺寸的减少。SVG 是使用XML文件描述的,这种文本格式的图片尺寸很小,并且便于修改。
* 设计上的轻便。在设计方面咱们能够任意修改SVG图片的颜色,这对于某些状况下须要同一张图像但不一样的颜色图片是很是方便的,只须要修改fill颜色就能够了。好比,单击下图片的不一样状态、按钮的背景图片等等。
View是什么?
简单来讲,View是Android系统在屏幕上的视觉呈现,也就是说你在手机屏幕上看到的东西都是View。
View是如何绘制出来的?
View的绘制流程是从ViewRoot的performTraversals()方法开始,依次通过measure(),layout()和draw()三个过程才最终将一个View绘制出来。
后面的章节会详细讲View 绘制过程,这里只是基础略带一下。
View是怎么呈如今界面上的?
Android中的视图都是经过Window来呈现的,无论Activity、Dialog仍是Toast它们都有一个Window,而后经过WindowManager来管理View。Window和顶级View——DecorView的通讯是依赖ViewRoot完成的。
关于Android View控件的理解
Android中控件大体被分为两类ViewGroup,View。ViewGroup做为容器管理View。Android视图,是相似于Dom树的架构。父视图负责测量定位绘制等操做。咱们常常在用的findViewById 方法代价昂贵的缘由,就是由于他负责至上而下遍历整棵控件树,来寻找View实例,在重复操做中尽可能少用。如今在用的不少控件都是直接或者间接继承自View的,为了方便理解可看下图
View和ViewGroup什么区别?
Android的UI界面都是由View和ViewGroup及其派生类组合而成的。其中,View是全部UI组件的基类,而ViewGroup是容纳这些组件的容器,其自己也是从View派生出来的。AndroidUI界面的通常结构可参见
须要注意的是嵌套次数最好不要超过10层,不然会下降效率,上图是3层
Android View刷新机制?
在Android的布局体系中,父View负责刷新、布局显示子View;而当子View须要刷新时,则是通知父View来完成
RelativeLayout和LinearLayout性能比较?
1.RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子View2次onMeasure
2.RelativeLayout的子View若是高度和RelativeLayout不一样,则会引起效率问题,当子View很复杂时,这个问题会更加严重。若是能够,尽可能使用padding代替margin。
3.在不影响层级深度的状况下,使用LinearLayout和FrameLayout而不是RelativeLayout。
Android UI界面架构理解
每一个Activity,Dialog,Toast都包含一个PhoneWindow对象,PhoneWindow设置DecorView为应用窗口的根视图。在里面就是熟悉的TitleView和ContentView,没错,平时使用的setContentView()就是设置的ContentView。
关于View的内容仍是比较多的,而本文只是做为Android基础的知识点做为初步了解,后面会有专门的章节来说解关于View的更多知识点。
水平有限,如有错漏,欢迎指正,批评,如需转载,请注明出处–http://blog.csdn.net/vfush,谢谢!