在上一章節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,謝謝!