【ANDROID游戏开发之六】在SURFACEVIEW中添加系统控件,并且相互交互数据!

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 

转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/306.html

———————————————————————

多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块;请点击下面联系进入阅读:

【Android游戏开发十九】(必看篇)SurfaceView运行机制详解—剖析Back与Home按键及切入后台等异常处理! 』

——————————————————————-

昨天圣诞节,没有出去,而是一天时间全部纠结在如何在SurfaceView中添加组件,例如添加常用的Button,TextView等等、一开始也想着从网上找些资料看看有没有可参考的,但是发现搜到的结果仍是些童鞋对此很疑惑并且也在找寻答案,那么,这里就把圣诞节一天的成果来和各位童鞋分享;

1.因为我们的SurfaceView是个View对于添加的组件其实也是View,如果我们只是一味的想在SurfaceView中添加View组件其实是错误的思想,当然我一开始也是想着直接在SurfaceView中定义或者去使用组件,但是结果肯定是不成功的,因为View不能添加View!

2.既然第一条肯定是错误的,那么我们就应该想到把我们的SurfaceView和组件都放在一个Layout里面,毕竟我们的的SurfaceView也是一个view和其他组件一同放在我们的layout里,那么这样一来肯定就能完成在SurfaceView中添加组件的目的啦。下面先上截图、

 

大家看到中间白色区域就是我们的SurfaceView啦,最上方是组件TextView ,最下方是Button 、对的,要的就是这个效果!而不是像前面文章中多个Activity切换,这样都在一个界面中啦。哇哈哈啊。好、下面来看代码吧:

先放上Xml 代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

<?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类中代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

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类的创建和实现等等和之前都是一样的,该怎么去写还怎么去写,但是!构造函数一定要注意!

1

2

3

4

/*

     * public MySurfaceView(Context context) { super(context); }//备注1(这里一定要引起注意,仔细看下文对备注1的解释 )

     */

public MySurfaceView(Context context, AttributeSet attrs) {//备注1}

这里解释下备注1:  这里有两个构造函数,当然我们用哪个都是可以的,但是在此时我们需要明确我们到底要使用哪个。

一个参数的构造函数:如果是new出来的此类实例肯定是没有问题,但是我们为了能在显示SurfaceView同时显示别的组件,所以把自定义的SurfaceView也当作组件注册在了main——xml中,所以这里需要注意,当在xml中注册的就必须在SurfaceView中使用这种含有两个参数的构造函数的方法, 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中去绑定,这里需要注意下;

本章源码下载: “SurfaceView添加组件且交互数据.rar”        下载地址:  http://vdisk.weibo.com/s/hq3c0

时间: 2024-10-03 04:23:52

【ANDROID游戏开发之六】在SURFACEVIEW中添加系统控件,并且相互交互数据!的相关文章

datepicker-silverlight的DataGrid中添加DatePicker控件使用滚动条滚动数据有误

问题描述 silverlight的DataGrid中添加DatePicker控件使用滚动条滚动数据有误 silverlight的DataGrid中添加DatePicker控件,初始设定DatePicker中的时间,连续使用滚动条滚动,初始设定DatePicker的值会随机改变. <sdk:DataGrid Grid.Row="1" HorizontalAlignment="Stretch" Name="dataGrid1" Vertical

嵌入式开发-在Window CE 操作系统中,如何在DataGrid 中添加ComboBox 控件

问题描述 在Window CE 操作系统中,如何在DataGrid 中添加ComboBox 控件 最近在开发手持机,因为公司要求,将ERP 系统置入到手持机中,发现在Window CE 系统中,很多 控件都无法使用.譬如说,要在DataGrid 中添加列,要求在DataGrid 中操作数据,下拉的 ComBobox 就没有,也没有DataGridComBoBox 列,如何处理,请各位兄弟指教. QQ:870088133 解决方案 CE版的控件是精简的,很多功能都没有.需要自己实现. 你说的添加C

向DataGrid控件中添加ComboBox控件

combobox控件|datagrid|datagrid控件   在前面看到了很多关于怎样向DataGrid中添加ComboBox控件的方法.使用的方法全部都是在VB6.0中的方法. 我还是要说说在CSND中发贴的朋友. 现在所谓的.NET编程人员,不知道是怎么了呢!只是停留在使用.NET的编程环境中.并没有真正的了解面向对象的.NET编程思想. 我现在就利用继承DataGridColumnStyle完成向DataGrid中添加ComboBox. 希望这样有助于大家了解真正的面向对象编程的思想.

串口通信-VB在components中添加MSComm控件

问题描述 VB在components中添加MSComm控件 VB中在components添加mscomm控件时为什么会显示"--could not be loaded"??求解...谢谢 解决方案 VB.NET直接用SerialPort控件. 解决方案二: MFC添加两个MSComm控件后提示'CMSComm' : 'class' type redefinition

我在coreldraw vba中添加mschart控件,结果显示不受信任

问题描述 我在coreldraw vba中添加mschart控件,结果显示不受信任 我在coreldraw vba中添加mschart控件,结果显示不受信任

VC中添加web控件的方法

在VC中使用WebBrowser控件的两方法 黄森堂(vcmfc)著   ClassWizard方式:   1.创建包装类:View->ClassWizard->Add Class->Form a Type Library->C:\winnt\system32\shdocvw.dll->只选择IWebBrowserApp类->OK->OK 2.声明一个类变量:IWebBrowserApp m_internetexplorer;,并包含刚才的头文件(xxx.h) 3

可否可以在窗口中添加图片控件,在运行时读取按指定配置文件内容,再向图片控件添加数据!

问题描述 大家过年好!小弟给大家拜年了!无聊想写一个象棋程序!有什么控件可以是圆形的,可以添加图片?或者让图片透明部分显示此控件下面的内容?请前辈们指点!谢谢了! 解决方案 解决方案二:如果你使用WPF/Silverlight,随便什么控件(比如说Image控件)都可以承载透明前景图片.透明背景图片.你不会还只是使用20年前的Winform技术吧?解决方案三:随便搜两个介绍:解决方案四:引用1楼sp1234的回复: 如果你使用WPF/Silverlight,随便什么控件(比如说Image控件)都

如何在C++ Builder 2007中添加ActiveX控件

BCB2007 的发布是一件令人振奋的事情,它强大的功能和良好的稳定性让我决定从BCB6.0 转向2007. BCB2007 的变化还是比较大的,它不能像6.0那样方便地安装我们的ActiveX 控件,甚至有些网友说它根本不能安装ActiveX 控件,这样导致了广大网友对BCB2007的不满.BCB2007真的无法安装我们的ActiveX 控件吗? 答案是:可以安装. 详细的安装方案看下面的描述吧,有2个方案. [方案一] 条件:安装有BCB6.0 和 BCB2007 步骤: (1) 这里我们用

往Visual Studio 2010中添加DockPanel控件

问题描述 我是按以下方法做的:1建立WinForm应用程序,生成默认窗体Form1..2项目--->添加引用------>浏览--->weiFenLuo.winFormsUI.Docking.dll3窗体属性IsMdiContainer:True.4工具-->选择工具项-->.net组件-->浏览-->weiFenLuo.winFormsUI.Docking.dll但是,在工具箱中没有出现那个DockPanel控件!求大神帮帮忙!!谢谢! 解决方案 解决方案二:w