Android群英傳筆記系列一view的介紹

来源:http://www.cnblogs.com/xy95/archive/2016/10/30/6014249.html
-Advertisement-
Play Games

學習完第一行代碼後,繼續學習Android群英傳,希望能堅持下去,好好學習完這本書,並及時做好相關筆記,鞏固相關知識; 一. View的介紹: 1`.我們先來看下view樹結構: 2.樹結構內容: a.viewparent是整棵樹的核心,它統一調度和分配所有的交互管理事件。 b.控制項分為viewgr ...


  學習完第一行代碼後,繼續學習Android群英傳,希望能堅持下去,好好學習完這本書,並及時做好相關筆記,鞏固相關知識;

一. View的介紹:

1`.我們先來看下view樹結構:

2.樹結構內容:

a.viewparent是整棵樹的核心,它統一調度和分配所有的交互管理事件。

b.控制項分為viewgroup和view兩種控制項,viewgroup作為父控制項可以包含多個vie       w控制項。

c.我們知道在使用控制項前都要通過findViewById的方法來實例化控制項,那麼在樹結構中,實際上表現為通過樹的深度優先遍歷來查找到對應的元素。

3.UI界面構架圖:

  

4.UI界面構架圖內容:

a.實際上每個activity都包含一個window對象,而window對象是通過PhoneWindow來實現的。

b.PhoneWindow又將一個DecorView設置為整個應用視窗的根View。(簡單的來說就是,我們所看到的整個手機屏幕內容就是整個的DecorView);

c.然後在我們手機應用中,一般含有兩個view,一個是標題欄,即TitleView,另一個就是呈現內容的view,即ContentView.(當然,我們也可以通過一些辦法隱藏,比如在setContentView()之前使用:

requestWindowFeature(Window.FEATURE_NO_TITLE)的方法即可。)

d.界面的顯示過程:當程式在onCreate()方法中調用setContentView方法後,ActivityManagerService會回調onResume方法,系統便會將整個DecorView添加到PhoneWindow中。

二. View的測量:

1.測量的模式有三種:

EXACTLY模式:指的是精確值模式,比如我們設置layout_width=30dp,那麼這種便屬於精確值模式。

AT_MOST模式:指的是最大值模式,比如我們使用的wrap_content便是屬於這種模式,允許隨著內容的變化而變化,只要不超過父控制項的所允許的最大尺寸即可。

UNSPECIFIED模式:這個是沒有限制的模式,想要多大就可以多大,一般是在自定義view中使用。

2.關於重寫onMeasure()方法:

a.為什麼要重寫onMeasure方法?

因為view類預設的onMeasure方法只支持EXACTLY模式,所以如果我們想要用指定wrap_content的大小的話,就必須要重寫該方法。

b.重寫onMeasure的過程:

(1)創建一個類繼承至view:

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

我們會看到這樣的一個初始的onMeasure函數,然後我們來看下super.OnMeasure的方法:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
            getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}

所以在這裡我們要重寫setMeasuredDimension這個函數:我們再下麵添加這樣一句話

setMeasuredDimension(measureSize(200,widthMeasureSpec),measureSize(200,heightMeasureSpec));
我們來看下這句話的含義,實際上我們自定義了一個measureSize的函數,然後分別傳入兩個參數,第一個為預設值,第二個實際值。然後我們來看下這個自定義函數是如何實現的:
private int measureSize(int defaultSize,int measureSpec){
    int result=0;//定義result來作為返回值
    int specMode=MeasureSpec.getMode(measureSpec);//獲取到測量的模式
    int specSize=MeasureSpec.getSize(measureSpec);//獲取到測量值
    if (specMode==MeasureSpec.EXACTLY){//如果為精確測量,返回測量值即可
        result=specSize;
    }else{
        result=defaultSize;//如果為其他兩種模式,設置為預設值
        if (specMode==MeasureSpec.AT_MOST){//如果為最大值模式,我們要獲取到預設值和測量值中最小的值
            result=Math.min(result,specSize);
        }
    }
    return result;
}

最後我們在xml文件中引用這個自定義的view:

<main.view.com.view.viewTest
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#ff0000"
 />

 



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 項目 (移動的廣告牌) 要求: 1,實現圖片一次以移動的方式出現,到最後一張完全出現時,回彈到第一張 2,滑鼠放在圖片上面圖片移動,滑鼠離開,圖片停止移動 *{ padding: 0; margin: 0;}/*添加背景圖片,個人愛好*/body{ background: url(../img/qu ...
  • 引言 webix.js被壓縮後很多字母不清楚是什麼用處,看源碼整理了部分出來,以button為例 1、button代碼 效果 2、以下代碼在F12的console中測試 define:方法(可以定義對象屬性的值) refresh:方法(刷新控制項) 效果 D 和 C:兩個都是定義屬性值的,define ...
  • 看到一些曾經只會灌水的網友,在學習了前端之後,已經能寫出下載量幾千幾萬的腳本、樣式,幫助大眾,成為受歡迎的人,感覺滿羡慕的。我也想學會前端技術,變得受歡迎呀。於是心血來潮,開始學習前端知識,並寫下了這個小練習。 基本思路是這樣的: 效果圖: 代碼如下: 點我進入線上版 這算是自己學習Javascri ...
  • 一:時間轉時間戳:javascript獲得時間戳的方法有四種,都是通過實例化時間對象 new Date() 來進一步獲取當前的時間戳 1.var timestamp1 = Date.parse(new Date()); // 結果:1477808630000 不推薦這種辦法,毫秒級別的數值被轉化為0 ...
  • 2016-10-30 13:11:56 引言 最近做項目,發現ajax請求不能在伺服器中直接重定向到登錄頁面。查了些資料發現jquery的ajax請求有人給出了方法。但是webix的ajax請求和jquery的有些區別。這裡模仿jquery的處理方式實現webix的ajax請求session超時跳轉 ...
  • 前言 啦啦啦~博主又來騷擾大家啦~大家是不是感覺上次的Android開發博文有點長呢~主要是因為博主也是小白,在做實驗的過程中查詢了很多很多概念,努力去理解每一個知識點,才完成了最終的實驗。還有就是隨著我們的實驗的進行,代碼量也會越來越多,所以在接下來的博文中會對源碼進行取捨,而不會把全部的實驗代碼 ...
  • 1.三級緩存設計步驟: * 從記憶體中取圖片 * 從本地文件中取圖片 向記憶體中保持一份 * 請求網路圖片,獲取圖片,顯示到控制項上 * 向記憶體存一份 * 向本地文件中存一份 2.網路緩存 線程池類Executors的使用 public static ExecutorService newCachedTh ...
  • 1.關聯庫 compile 'com.android.support:design:23.3.0' 2.佈局寫上TabLayout 3.TabLayout和ViewPager關聯 4.解決TabLayout和ViewPagerIndicator的相容問題 4.1 <activity android: ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...