在上1章節Android 面試題總結之Android 基礎ListView(5) 主要是ListView的優化,原理和1些基本問題。
在瀏覽進程中有任何問題,請及時聯系。如需轉載請注明 fuchenxuan de Blog
本章系《Android 之美 從0到1 – 高手之路》Android基礎將會總結了Android 布局常見面試問題。其實對基礎方面Android 開發來講,常常面試不過就是UI,網絡,數據庫,這3大方面,本章節總結了筆記經典的問題,希望對廣大Android 開發者,有所幫助。
談談 UI 中, Padding 和 Margin 有甚么區分?
android:padding 和 android:layout_margin 的區分,其實概念很簡單,padding 是站在父 view 的角度描寫問 題,它規定它里面的內容必須與這個父 view 邊界的距離。margin 則是站在自己的角度描寫問題,規定自己和其他(上下左右)的 view 之間的距離,如果同1級只有1個 view,那末它的效果基本上就和 padding 1樣了。
hierarchyviewer
工具分析視圖樹,幫助我們發現沒有用到的布局。 <include>
標簽復用相同的布局代碼 <merge>
標簽減少視圖層次結構 Include
或 ViewStub
標簽從外部導入 xml 結構時,可以將被導入的 xml 用 merge 作為根節 點表示,這樣當被嵌入父級結構中后可以很好的將它所包括的子集融會到父級結構中,而不會出現冗余的節點。 <merge>
只能作為 xml 布局的根元素。 <ViewStub>
實現 View 的延遲加載android:layout_gravity 和 android:gravity 的區分?
第1個是讓該布局在其父控件中的布局方式,第2個是該布局布置其字對象的布局方式。
關于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的寬度?
布局大小=剩余空間大小權重所占比例+設定的寬度
scrollView 嵌套 listview 方式除丈量還有甚么方法?
dp 和 px 之間的關系?
dp:是 dip 的簡寫,指密度無關的像素。 指1個抽象意義上的像素,程序用它來定義界面元素。1個與密度無關的,在邏輯尺寸上,與1個位于像素密度為 160dpi 的屏幕上的像素是1致的。 要把密度無關像素轉換為屏幕像素,可以用這樣1個簡單的公式: pixels=dips*(density/160)。舉個例子,在 DPI 為 240 的屏幕上,1 個 DIP 等 于 1.5 個物理像素。
布局時最好使用 dp 來定義我們程序的界面,由于這樣可以保證我們的 UI 在各種分辨率的屏幕上都可以正常顯示。
/**
* 根據手機的分辨率從 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般我們需要在以下幾個文件夾中提供不同大小的圖片。
甚么是屏幕尺寸、屏幕分辨率、屏幕像素密度?
屏幕尺寸是指屏幕對角線的長度。單位是英寸,1英寸=2.54厘米
屏幕分辨率是指在橫縱向上的像素點數,單位是px,1px=1像素點,1般是縱向像素橫向像素,如1280×720
屏幕像素密度是指每英寸上的像素點數,單位是dpi,即“dot per inch”的縮寫,像素密度和屏幕尺寸和屏幕分辨率有關。
Android 樣式和主題?
樣式(Styles):
Android 允許在外部樣式文件中定義 Android 利用程序的 Look 和 Feel ,你可以將定義好的樣式利用在不同的視圖(Views)上。你可以在 XML 文件中定義樣式,并將這些樣式應用到不同的組件上。使用XML這類方式定義樣式,你只需要配置1些通用的屬性,以后如果需要修改樣式,可以集中修改。
屬性(Attributes):
你也能夠將單個屬性利用到 Android 樣式上,通常會在自定義View 的時候,自定義屬性。
主題(Themes):
主題相比單個視圖而言,是利用到全部 Activity 或 application 的樣式
如何將Acitivity中的Window的背景圖設置為空?
getWindow().setBackgroundDrawable(null);android的默許背景是否是為空。
在明白上面基礎問題的1些基本概念后,這里總結了1些布局適配的經驗。
在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),1個唯1的layout文件應當保存在res/layout-large/中。
Drawable屬于輕量級的、使用也很簡單,Android把可繪制的對象抽象為Drawable,不同的圖形圖象資源就代表著不同的drawable類型, 在實際的開發進程中使用@drawable
來使用drawable資源。關于Drawable更多的請看下圖
Android 5.0 新特性–使用SVG圖片資源
SVG的全稱是Scalable Vector Graphics,叫可縮放矢量圖形。它和位圖(Bitmap)相對,SVG不會像位圖1樣由于縮放而讓圖片質量降落。
優點:
* 圖片的完善適配。SVG 圖象在放大或改變尺寸的情況下其圖形質量不會有所損失。這樣我們大大減少了適配所需要的多種分辨率圖片,而且能夠讓圖片完善適配多種分辨率,減少了APK包大小并提升了用戶體驗。
* 尺寸的減小。SVG 是使用XML文件描寫的,這類文本格式的圖片尺寸很小,而且便于修改。
* 設計上的輕便。在設計方面我們可以任意修改SVG圖片的色彩,這對某些情況下需要同1張圖象但不同的色彩圖片是非常方便的,只需要修改fill色彩就能夠了。比如,單擊下圖片的不同狀態、按鈕的背景圖片等等。
View是甚么?
簡單來講,View是Android系統在屏幕上的視覺顯現,也就是說你在手機屏幕上看到的東西都是View。
View是如何繪制出來的?
View的繪制流程是從ViewRoot的performTraversals()方法開始,順次經過measure(),layout()和draw()3個進程才終究將1個View繪制出來。
后面的章節會詳細講View 繪制進程,這里只是基礎略帶1下。
View是怎樣顯現在界面上的?
Android中的視圖都是通過Window來顯現的,不管Activity、Dialog還是Toast它們都有1個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界面的1般結構可參見
需要注意的是嵌套次數最好不要超過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都包括1個PhoneWindow對象,PhoneWindow設置DecorView為利用窗口的根視圖。在里面就是熟習的TitleView和ContentView,沒錯,平時使用的setContentView()就是設置的ContentView。
關于View的內容還是比較多的,而本文只是作為Android基礎的知識點作為初步了解,后面會有專門的章節來說解關于View的更多知識點。
水平有限,若有錯漏,歡迎指正,批評,如需轉載,請注明出處–http://blog.csdn.net/vfush,謝謝!