android學習日記06--View視圖

1、android 界面開發java

一、三個重要的類:View視圖、Canvas畫布、Paint畫筆
二、android 界面開發經常使用三種視圖
  View            --只能在主線程中更新,沒有緩存機制,適合畫面更新較少的界面,好比有按鍵按下才變化的界面。
  SurfaceView --能夠設置獨立的線程,有緩存機制,主要用於2D遊戲
  GLSurfaceView --主要用於3D遊戲,暫時不學習android

 

2、View框架canvas

  同SWIMG、AWT同樣,Android也提供大量的View組件給開發者,全部組件都是View的子類,包括之前介紹的經常使用控件和ViewGroup也是。ViewGroup是View的子類,因此它也具備View的特性,但它主要用來充當View的容器,將其中的View視做本身的孩子,對它的子View進行管理,固然它的孩子也能夠是ViewGroup類型。ViewGroup(樹根)和它的孩子們(View和ViewGroup)以樹形結構造成了一個層次結構,View類有接受和處理消息的功能,android系統所產生的消息會在這些ViewGroup和 View之間傳遞。設計模式

 

一、View類結構緩存

java.lang.Object
-------android.view.View安全

直接子類:AnalogClock, ImageView, KeyboardView, ProgressBar, SurfaceView, TextView, ViewGroup, ViewStub框架

固然還有許多其餘間接子類。ide

 

二、ViewGroup函數

  ViewGroup繼承於View,它能夠包含其餘的View,就像一個View的容器,咱們能夠調用其成員函數addView()將View看成孩子放到ViewGroup中。佈局

咱們常用的LinearLayout、relativeLayout等都是ViewGroup的子類,ViewGroup類中有一個內部類ViewGroup.LayoutParams,咱們常用LayoutParams的子類來構造佈局參數。

  咱們也能夠自定義本身的佈局,以方便往後使用和維護,這時咱們就須要繼承ViewGroup類並在派生類中重寫ViewGroup的一些方法。

 

三、自定義View

  有些自帶組件可能沒法知足需求,這時候每每須要自定義View,通常只要主要底下兩點就能夠了。

  (1) 繼承View

  (2) 重寫感興趣的方法

自定義View的經常使用方法:

  onFinishInflate() 當View中全部的子控件 均被映射成xml後觸發

  onMeasure(int, int) 肯定全部子元素的大小

  onLayout(boolean, int, int, int, int) 當View分配全部的子元素的大小和位置時觸發

  onSizeChanged(int, int, int, int) 當view的大小發生變化時觸發

  onDraw(Canvas) view渲染內容的細節

  onKeyDown(int, KeyEvent) 有按鍵按下後觸發

  onKeyUp(int, KeyEvent) 有按鍵按下後彈起時觸發

  onTrackballEvent(MotionEvent) 軌跡球事件

  onTouchEvent(MotionEvent) 觸屏事件

  onFocusChanged(boolean, int, Rect) 當View獲取 或失去焦點時觸發

  onWindowFocusChanged(boolean) 當窗口包含的view獲取或失去焦點時觸發

  onAttachedToWindow() 當view被附着到一個窗口時觸發

  onDetachedFromWindow() 當view離開附着的窗口時觸發,Android123提示該方法和  onAttachedToWindow() 是相反的。

  onWindowVisibilityChanged(int) 當窗口中包含的可見的view發生變化時觸發

 

四、View實例

  在View上 寫"GameView" ,按方向鍵 上下左右會隨之移動,觸摸屏幕、拖動也會移到相應位置。

新建MyView類 繼承View基類

 1 package com.example.gameview;
 2 
 3 import android.content.Context;
 4 import android.graphics.Canvas;
 5 import android.graphics.Color;
 6 import android.graphics.Paint;
 7 import android.view.KeyEvent;
 8 import android.view.MotionEvent;
 9 import android.view.View;
10 
11 public class MyView extends View {
12 
13     private int x=10,y=10;
14     
15     public MyView(Context context) {
16         super(context);
17         setFocusable(true);//設置當前view爲焦點操做
18         // TODO Auto-generated constructor stub
19     }
20     
21     @Override
22     protected void onDraw(Canvas canvas) {
23         // TODO Auto-generated method stub
24         Paint paint = new Paint();
25         paint.setColor(Color.BLACK);
26         canvas.drawText("GameView", x, y, paint);
27         
28         super.onDraw(canvas);
29     }
30     
31     @Override
32     public boolean onKeyDown(int keyCode, KeyEvent event) {
33         // TODO Auto-generated method stub
34         if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
35             y-=2;
36         } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN){
37             y+=2;
38         } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
39             x-=2;
40         } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
41             x+=2;
42         }
43         
44         invalidate();
45         //postInvalidate();
46         return super.onKeyDown(keyCode, event);
47     }
48     
49     @Override
50     public boolean onKeyUp(int keyCode, KeyEvent event) {
51         // TODO Auto-generated method stub
52         return super.onKeyUp(keyCode, event);
53     }
54     
55     @Override
56     public boolean onTouchEvent(MotionEvent event) {
57         // TODO Auto-generated method stub
58         int tx = (int)event.getX();
59         int ty = (int)event.getY();
60         //玩家手指點擊屏幕的動做
61         if (event.getAction() == MotionEvent.ACTION_DOWN) {
62             x = tx;
63             y = ty;
64             //玩家手指擡起離開屏幕的動做
65         } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
66             x = tx;
67             y = ty;
68             //玩家手指在屏幕上移動的動做
69         } else if (event.getAction() == MotionEvent.ACTION_UP) {
70             x = tx;
71             y = ty;
72         }
73 //        //獲取用戶手指觸屏的X座標賦值與文本的X座標
74 //        x = (int)event.getX();
75 //        //獲取用戶手指觸屏的Y座標賦值與文本的Y座標
76 //        y = (int)event.getY();
77 //        //重繪畫布
78         
79         //重繪畫布
80         invalidate();
81         //postInvalidate();
82         return true;
83     }
84 
85 }
View Code

 

須要特別注意的知識點以下:

一、Activity全屏顯示

1 // 去掉Activity標題欄
2 this.requestWindowFeature(Window.FEATURE_NO_TITLE);
3 // 去掉 電量、時間等狀態欄,全屏顯示
4 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
View Code

也能夠在AndroidManifest裏設置

1 android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
View Code

 

二、設置模擬器方向鍵生效
C:\Users\XX\.android\avd\XX.avd
config.ini
hw.dPad=no,把no改爲yes,以下:
hw.dPad=yes
重啓模擬器便可
XX根據我的命名不一樣而不一樣

 

三、重寫onDraw方法

1 Paint paint = new Paint();// 畫筆類
2 paint.setColor(Color.BLACK);// 初始畫布爲白色,設置畫筆爲黑色
3 canvas.drawText("GameView", x, y, paint);// 座標不管橫屏豎屏都是從右上角爲 0,0點開始的
4 
5 super.onDraw(canvas);
View Code

 

四、onKeyDown、onKeyUp、onTouchEvent
  分別表示按鈕 按下、擡起、觸摸屏幕的事件

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
  return super.onKeyDown(keyCode, event);
}

第一個參數爲鍵值,手機中每個按鈕都擁有一個徹底獨立的鍵值 經過按鍵鍵值就能夠肯定當前按下的是那一個按鍵。
第二個參數爲按鍵事件,  該對象中保存着當前按鍵的全部信息 好比 按鍵發生的時間 按鍵發生的次數  按鍵發生的類型等等。
經過以上兩個參數就能夠拿到當前按鍵事件的所附帶的一切信息

另外兩個方法的參數也同樣。

keyCode == KeyEvent.KEYCODE_DPAD_UP 表示 向上的方向鍵按下

 其餘方向鍵命名相似。

 

五、設置當前view爲焦點操做才能進行操做

  在View中需要監聽按鍵的話必需在構造方法中給當前View 設置控制焦點 需要調用 setFocusable(true); 若是沒有設置的話 onKeyDown 與onKeyUp 等跟按鍵有關的 永遠沒法監聽到按鍵事件。 在onKeyDown 與onKeyUp 經過keyCode 的值就能夠判斷當前按下那一個按鍵 ,而後根據event 事件對象就能夠拿到當前觸發事件的時間等等。

六、重畫
  invalidate();// 重繪View樹,即draw()過程,在UI主線程調用,不符合單線程安全設計模式  postInvalidate(); //可在本身建立的線程 經過handler通知UI主線程調用

相關文章
相關標籤/搜索