c6811bee-c419-319d-b0a1-c6922d9c5303

Himi 原創, 歡迎轉載,轉載請注明! 謝謝。
原文位址:HTTP://blog.csdn.net/xiaominghimi/archive/2010/12/26/6099194.aspx

 

各位童鞋請你們注意:surfaceview中確實有 onDraw這個方法,但是surfaceview不會自己去調用!!!

 

而我代碼中的ondraw 也好 draw 也好,都是我自己定義的一個方法。。。放線上程中不斷調用的,一定要注意!!

 

昨天耶誕節,沒有出去,而是一天時間全部糾結在如何在SurfaceView中添加元件,例如添加常用的Button,TextView等等、一開始也想著從網上找些資料看看有沒有可參考的,但是發現搜到的結果仍是些童鞋對此很疑惑並且也在找尋答案,那麼,這裡就把耶誕節一天的成果來和各位童鞋分享;

 

1.因為我們的SurfaceView是個View對於添加的元件其實也是View,如果我們只是一味的想在SurfaceView中添加View元件其實是錯誤的思想,當然我一開始也是想著直接在SurfaceView中定義或者去使用元件,但是結果肯定是不成功的,因為View不能添加View!

 

2.既然第一條肯定是錯誤的,那麼我們就應該想到把我們的SurfaceView和元件都放在一個Layout裡面,畢竟我們的的SurfaceView也是一個view和其他元件一同放在我們的layout裡,那麼這樣一來肯定就能完成在SurfaceView中添加元件的目的啦。下面先上截圖、

c6811bee-c419-319d-b0a1-c6922d9c5303  






大家看到中間白色區域就是我們的SurfaceView啦,最上方是元件TextView ,最下方是Button 、對的,要的就是這個效果!而不是像前面文章中多個Activity切換,這樣都在一個介面中啦。哇哈哈啊。好、下面來看代碼吧:

 

先放上Xml 代碼:




JAVA代碼
1.<?xml version="1.0" encoding="utf-8"?>
2.<LinearLayout xmlns:android="HTTP://schemas.android.com/apk/res/android"
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7. <LinearLayout
8. android:orientation="horizontal"
9. android:layout_width="wrap_content"
10. android:layout_height="wrap_content"
11. android:layout_gravity="center">
12.
13. <TextView
14. android:id="@+id/textview"
15. android:layout_width="fill_parent"
16. android:layout_height="fill_parent"
17. android:text="This is Himi"
18. android:textSize="32sp"
19. android:textColor="#00FF00"
20. android:gravity="center_horizontal"/>
21.
22. </LinearLayout>
23.
24. <FrameLayout
25. android:layout_width="fill_parent"
26. android:layout_height="wrap_content"
27. android:layout_weight="1" >
28. <com.himi.MySurfaceView android:id="@+id/view3d"
29. android:layout_width="fill_parent"
30. android:layout_height="fill_parent"/>
31. </FrameLayout>
32.
33. <LinearLayout
34. android:orientation="horizontal"
35. android:layout_width="wrap_content"
36. android:layout_height="wrap_content"
37. android:layout_gravity="center">
38. <Button
39.
40. android:layout_width="wrap_content"
41. android:layout_height="wrap_content"
42. android:text="Himi Button_1"
43. android:id="@+id/button1"/>
44.
45. <Button android:layout_width="wrap_content"
46. android:layout_height="wrap_content"
47. android:text="Himi Button_2"
48. android:id="@+id/button2"/>
49. </LinearLayout>
50.</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">

 

<TextView
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="This is Himi"
android:textSize="32sp"
android:textColor="#00FF00"
android:gravity="center_horizontal"/>

 

</LinearLayout>

 

<FrameLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" >
<com.himi.MySurfaceView android:id="@+id/view3d"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</FrameLayout>

 

<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<Button

 

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Himi Button_1"
android:id="@+id/button1"/>

 

<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Himi Button_2"
 
android:id="@+id/button2"/>
</LinearLayout>
</LinearLayout> 以上代碼很簡單,都是一些佈局方式和各個元件一些屬性及顯示方式的設定,當然主要看如何對我們的SurfaceView如何註冊在xml中的,那麼每個元件都有id這樣為了對後面其交互資料用到,因為我們要對每個元件操作,所以這裡都索引了id方面從R檔中取出其物件。




那麼,xml我們定義好了,看看代碼中如何實現的,這裡先說下Activity類中代碼:



JAVA代碼
1.package com.himi;
2.import android.app.Activity;
3.import android.os.Bundle;
4.import android.view.View;
5.import android.view.Window;
6.import android.view.WindowManager;
7.import android.view.View.OnClickListener;
8.import android.widget.Button;
9.import android.widget.TextView;
10.public class MainActivity extends Activity implements OnClickListener {
11. /** Called when the activity is first created. */
12. private Button button1, button2;
13. private TextView tv ;
14. @Override
15. public void onCreate(Bundle savedInstanceState) {
16. super.onCreate(savedInstanceState);
17. this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隱去標題(應用的名字)
18. //此設定必須要寫在setContentView之前,否則會有異常)
19. this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
20. WindowManager.LayoutParams.FLAG_FULLSCREEN);
21. setContentView(R.layout.main); //要先顯示,然後再對其元件取出、處理操作
22. tv=(TextView)findViewById(R.id.textview);
23. button1 = (Button) findViewById(R.id.button1);
24. button1.setOnClickListener(this);//這裡是監聽按鍵,因為本類使用了OnClickListener介面
25. button2 = (Button) findViewById(R.id.button2);
26. button2.setOnClickListener(this);
27. /* 其實大家也可以不用本類使用介面,可以內部類來完成。
28. * 以下是不使用OnClickListener介面的綁定監聽方式;
29. button2.setOnClickListener(new OnClickListener() {
30.
31. @Override
32. public void onClick(View v) {
33. //這裡處理按鍵動作
34.
35. }
36. });
37. */
38. }
39. @Override
40. public void onClick(View v) {
41. if (v == button1) {
42. MySurfaceView.button_str = "button 1被觸發";
43. tv.setText("button 1被觸發");
44. } else if (v == button2) {
45. MySurfaceView.button_str = "button 2被觸發";
46. tv.setText("button 2被觸發");
47. }
48. }
49.}
package com.himi;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
private Button button1, button2;
private TextView tv ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隱去標題(應用的名字)
//此設定必須要寫在setContentView之前,否則會有異常)
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main); //要先顯示,然後再對其元件取出、處理操作
tv=(TextView)findViewById(R.id.textview);
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);//這裡是監聽按鍵,因為本類使用了OnClickListener介面
button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(this);
/* 其實大家也可以不用本類使用介面,可以內部類來完成。
* 以下是不使用OnClickListener介面的綁定監聽方式;
button2.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//這裡處理按鍵動作

}
});
*/
}
@Override
public void onClick(View v) {
if (v == button1) {
MySurfaceView.button_str = "button 1被觸發";
tv.setText("button 1被觸發");
} else if (v == button2) {
MySurfaceView.button_str = "button 2被觸發";
tv.setText("button 2被觸發");
}
}
} 該有的備註在代碼後面都備註了,MySurfaceView.button_str,這個是自己的SurfaceView中定義的一個static 的變數用來交互資料用到;在那麼下面就要看我們的SurfaceView,當在Xml註冊需要注意什麼了,我半天的時候都花在了這裡!!!一定要引起注意,這也是在SurfaceView中並顯示元件完成最重要的一步。
先分析:

1.SurfaceView類的創建和實現等等和之前都是一樣的,該怎麼去寫還怎麼去寫,但是!建構函式一定要注意!



JAVA代碼
1./*
2. * public MySurfaceView(CoNtext coNtext) { super(coNtext); }//備註1(這裡一定要引起注意,仔細看下文對備註1的解釋 )
3. */
4.public MySurfaceView(CoNtext coNtext, AttributeSet attrs) {//備註1}
/*
* public MySurfaceView(CoNtext coNtext) { super(coNtext); }//備註1(這裡一定要引起注意,仔細看下文對備註1的解釋 )
*/
 
public MySurfaceView(CoNtext coNtext, AttributeSet attrs) {//備註1} 這裡解釋下備註1: 這裡有兩個建構函式,當然我們用哪個都是可以的,但是在此時我們需要明確我們到底要使用哪個。
一個參數的建構函式:如果是new出來的此類實例肯定是沒有問題,但是我們為了能在顯示SurfaceView同時顯示別的元件,所以把自訂的SurfaceView也當作元件註冊在了main——xml中,所以這裡需要注意,當在xml中註冊的就必須加上這種含有兩個參數的建構函式的方法, xml初始化的時候會調用兩個參數的這個構造方法, (當時這個問題困擾了半天的研究時間,最後在一個群友的説明下才發現是這裡出了問題) 那麼含有兩個構造參數的方法裡第二個參數指的自訂的元件的一些屬性,就像長寬一樣,你可以給元件屬性,就是通過這個來傳遞的!

那麼在SurfaceView 中並一同顯示元件也就到底完結了,回顧下,一共分為3步,1.將我們的SurfaceView 作為一個元件view 和其他元件一同放置到佈局中,當然佈局的方式和顯示的方式大家自己隨自己喜歡定義! 2.在我們的SurfaceView中一定要使用兩個建構函式的建構函式,一定!一定! 就這裡有區別,別的還是該怎麼處理就怎麼處理,就是建構函式換了 3.交互資料,對其按鍵的綁定在 activity中完成,別把view綁定在咱們的SurfaceView中啊,否則報錯- -、

這裡說下為什麼要在activity中去綁定按鍵處理 而不是在我們的surfaceview中去綁定:



其實根據xml中定義button時的id 我們可以通過R.id 索引取到button,不管在activity中還是我們的surfaceview中都可以取到,但是!綁定button這一步如果在 surfaceview中去寫就一定報錯,原因我解釋下;

我們在xml中定義我們的surfaceview 和 元件button、textview等等的時候 他們是同一級別的!!而不是把button包含在 surfaceview

裡,所以雖然在surfaceview中可以根據id索引到button但綁定的時候是無法找到button的,僅自己們的activitysetContentView(R.layout.main); 顯示的button,所以只能在顯示它的activity中去綁定,這裡需要注意下;

下面分享出源碼:

源碼下載位址:

HTTP://download.csdn.net/source/2939526

(推薦大家訂閱本博客,因為咱的更新速度可是很快的~娃哈哈)
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()