javaview
Ⅰ java中view類下為什麼在類名稱中可以有點號,比如View.OnClickListener
在Java中,可以將一個類定義在另一個類裡面或者一個方法裡面,這樣的類稱為內部類。廣泛意義上的內部類一般來說包括這四種:成員內部類、局部內部類、匿名內部類和靜態內部類。
成員內部類是最普通的內部類,它的定義為位於另一個類的內部,形如下面的形式:
classCircle{
doubleradius=0;
publicCircle(doubleradius){
this.radius=radius;
}
classDraw{//內部類
publicvoiddrawSahpe(){
System.out.println("drawshape");
}
}
}
這樣看起來,類Draw像是類Circle的一個成員,Circle稱為外部類。成員內部類可以無條件訪問外部類的所有成員屬性和成員方法(包括private成員和靜態成員)。不過要注意的是,當成員內部類擁有和外部類同名的成員變數或者方法時,會發生隱藏現象,即默認情況下訪問的是成員內部類的成員。如果要訪問外部類的同名成員,需要以下面的形式進行訪問:
外部類.this.成員變數
外部類.this.成員方法
雖然成員內部類可以無條件地訪問外部類的成員,而外部類想訪問成員內部類的成員卻不是這么隨心所欲了。在外部類中如果要訪問成員內部類的成員,必須先創建一個成員內部類的對象,再通過指向這個對象的引用來訪問,成員內部類是依附外部類而存在的,也就是說,如果要創建成員內部類的對象,前提是必須存在一個外部類的對象。創建成員內部類對象的一般方式如下
publicclassTest{
publicstaticvoidmain(String[]args){
//第一種方式:
Outteroutter=newOutter();
Outter.Innerinner=outter.newInner();//必須通過Outter對象來創建
//第二種方式:
Outter.Innerinner1=outter.getInnerInstance();
}
}
classOutter{
privateInnerinner=null;
publicOutter(){
}
publicInnergetInnerInstance(){
if(inner==null)
inner=newInner();
returninner;
}
classInner{
publicInner(){
}
}
}
Ⅱ Java android中的View具體指什麼
簡單來說就是你在手機上能看到:比如按鈕、菜單等
和看不到的:比如布局等。
都是View
Ⅲ android studio java 繼承View錯誤
沒有引入View ,游標移到View然後ALT+ENTET
Ⅳ java怎樣輸出不換行
System.out.println()這個是在輸出內容之後換行,而 System.out.print()輸出內容之後不換行。只是一個 ln 的差距。
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = { 11, 22, 33, 44, 55 };
System.out.print("[");
for (int x = 0; x < arr.length; x++) {
if (x == arr.length - 2) {
System.out.println(arr[x] + "]");
當x==0時:執行else中的語句,結果是:[11]
當x==1時:執行else中的語句,結果是:[11 22]
當x==2時:執行else中的語句,結果是:[11 22 33]
當x==3時:執行 if 中的語句,結果是:[11 22 33 44],此處執行完就會換行
當x==4時:執行else中的語句,結果是:[11 22 33 44]結束。
(4)javaview擴展閱讀:
當編輯並運行一個Java程序時,需要同時涉及到這四種方面。使用文字編輯軟體(例如記事本、寫字板、UltraEdit等)或集成開發環境(Eclipse、MyEclipse等)在Java源文件中定義不同的類,通過調用類(這些類實現了Java API)中的方法來訪問資源系統;
把源文件編譯生成一種二進制中間碼,存儲在class文件中,然後再通過運行與操作系統平台環境相對應的Java虛擬機來運行class文件,執行編譯產生的位元組碼,調用class文件中實現的方法來滿足程序的Java API調用。
Ⅳ java中設計模式中Control、View之間的調用
我覺得你弄錯了C和V的關系,應該是這樣的:
Control a=new Control();
View b=new View();
b.setSomeListenner(a);
然後,視圖b在觸發某些事件的時候,比如某個按鈕被點擊的時候,去調用a的相關方法。
另外樓上說的也行得通,把view當做參數傳回去就行嘛。
Ⅵ java中setViewportView()的作用是啥
看API:
setViewportView
public void setViewportView(Component view)創建一個視口(如果有必要)並設置其視圖。不直接為 JScrollPane 構造方法提供視圖的應用程序應使用此方法指定將顯示在滾動窗格中的滾動組件子級。例如:
JScrollPane scrollpane = new JScrollPane();
scrollpane.setViewportView(myBigComponentToScroll);
應用程序不應將子級直接添加到滾動窗格。
Ⅶ JAVA View類
v代表具有View這個類的屬性的一個對象
Ⅷ View顯示原理
Android設備的顯示屏被抽象成一個幀緩沖區(frame buffer,fb)。SurfaceFlinger通過向這個幀緩沖區寫入內容來繪制界面。在硬體抽象層被封裝成Gralloc模塊。
用戶空間的應用進程先假裝gralloc模塊,用gralloc模塊申請圖形緩沖區,並映射入本進程空間,寫入要繪制的內容。然後把圖形緩沖區、通過fb、寫入幀緩沖區
分配圖形緩沖區,有兩種方式,一種是直接在幀緩沖區上分配圖形緩沖區,這樣的話寫入的內容就相當於直接寫入幀緩沖區。第二種是在進程空間分配圖形緩沖區,這使用的是匿名貢獻內存。一般情況下,只有SurfaceFlinger會在幀緩沖區直接分配,而用戶程序和SurfaceFlinger都會用匿名共享內存。
在內存中分配圖形緩沖區的方法,也是需要通過SurfaceFlinger,由其創建一塊匿名共享內存,然後和請求分配的進程共享。
Surface的創建過程就是Activity的顯示過程,在 ActivityThread.handleResumeActivity() 中調用了 Activity.makeVisible()具體實現:
WindowManagerImpl中的addView
WindowManagerGlobal中的addView
ViewRootImpl中的構造函數
在創建ViewRootImpl的時候會創建Surface,也會創建WindowSession用於和WMS通信,同時也會創建Choreographer他是存儲在ThreadLocal中的也就是每一個線程都有一個
WindowManagerGlobal中的getWindowSession()
WindowManagerService.openSession:
ViewRootImpl.setView()
WindowManagerService的addWindow
ViewRootImpl的requestLayout()
會調用scheleTraversals,這里方法里會設置一個標記位防止多次調用requestLayout(),然後設置一個消息屏障屏蔽普通消息,丟一個非同步消息到Choreographer,在下一次Vsync信號來的時候執行Runnable調動doTraversals,然後調用performTraversals,開始執行performMeasure,performLayout,performDraw。這里會調到draw方法
此時的Surface是空的,什麼都沒有。需要向WMS匯報,然後綁定到native層的Surface
performTraversals()會調到relayoutWindow(),在 relayoutWindow() 中會調用 IWindowSession 的 relayout(),這是一個跨進程方法會調用到 WMS 中的 Session.relayout(),最後調用到 WindowManagerService.relayoutWindow()
WindowManagerService.java::WindowState:
構造Surface對象
WMS向SurfaceFlinger通過SurfaceControl申請一塊Buffer然後將它和將它和Java層的Surface綁定在一起
SurfaceControl 類可以看作是一個 wrapper 類,它封裝了一些函數,通過這些函數可以方便地調用 mClient 或 ISurface 提供的函數。最後會執行 From() 返回給 App 客戶端
From 期間一共有三個關鍵對象,它們分別是:SurfaceComposerClient、 SurfaceControl、Surface,這個 Surface 對象屬於 Native 層,和 Java 層的 Surface 相對應其中轉移到 ViewRoot 成員變數 mSurface 中的,就是最後這個 Surface 對象了。
在 SurfaceFlinger 進程中,Client 的一個 Layer 將使SharedBufferStack 數組中的一個成員,並通過 SharedBufferServer 結構來控制這個成員, SurfaceFlinger 是消費者,所以可由 SharedBufferServer 來控制數據的讀取。與之相對應,客戶端的進程也會有一個對象來使用這個 SharedBufferStack,可它是通過另外一個叫 SharedBufferClient 的結構來控制的。客戶端為 SurfaceFlinger 提供數據,所以可由 SharedBufferClient 控制數據的寫入
如圖所示,在 App 進程中創建 PhoneWindow 後會創建 ViewRoot。ViewRoot 的創建會創建一個 Surface,這個 Surface 其實是空的,通過與 WindowManagerService 通信 From() 一個NativeSurface。在與 SurfaceFlinger 通信時,會創建 SharedClient 一段共享內存,裡面存放的是 SharedBufferStack 對應 SurfaceFlinger 中的 SurfaceLayer 每個 Layer 其實是一個 FrameBuffer,每個 FrameBuffer 中有兩個 GraphicBuffer 記作 FrontBuffer 和 BackBuffer。
在SurfaceFlinger 中 SharedBufferServer 來管理 FrameBuffer。同時在 App 端 From() 出來 NativeSurface 時會創建一個 SharedBufferClient 與 SharedClient 這塊共享內存關聯。當客戶端 addView() 或者需要更新 View 時,會通過 SharedBufferClient 寫入數據到 ShareClient 中,SurfaceFlinger 中的 SharedBufferServer 接收到通知會將 FrameBuffer 中的數據傳輸到屏幕上。
持有現在和下一個狀態,以及目前Surface數據,和顯示設備數組。已GraphicPlane對象來管理系統的顯示設備
有三種線程:
渲染過程
surfaceflinger是一個守護進程,
Zygote啟動System進程在執行System的main方法,會載入android_servers庫,會調用SurfaceFlinger.instantiate()方法。
SurfaceFlinger啟動之前,Binder驅動已經啟動好了,於是它把自己加入Binder線程池。接下來啟動UI渲染線程。再創建一個對象描述顯示屏,這個過程中會創建控制台線程,監控控制台事件。
開辟一塊匿名共享內存,將顯示屏的信息寫在上面。
參考
https://www.cnblogs.com/blogs-of-lxl/p/11272756.html
https://fourfire.top/#/Android_Framework/View%E6%98%AF%E6%80%8E%E4%B9%88%E7%94%BB%E5%87%BA%E6%9D%A5%E7%9A%84%EF%BC%88%E4%BA%8C%EF%BC%89%E2%80%94%E2%80%94SurfaceFlinger
https://blog.csdn.net/yangwen123/article/details/12192401
https://blog.csdn.net/vviccc/article/details/104860616
https://www.jianshu.com/p/198701520cd7?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=weixin