本站文章均为 李华明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

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

  1. 如何在VB中添加SysInfo控件

    如何在VB中添加SysInfo控件## SysInfo 控件是用来响应操作系统发送给所有应用程序的系统消息.应用程序在必要时就可适应操作系统的变化.我主要用来识别有无读卡器插入. (1)在最左侧工具箱 ...

  2. 【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!

     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigame.com/android-game/306.html 很多童鞋说 ...

  3. 【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/306.html   ...

  4. Sharepoint学习笔记—Ribbon系列-- 5. 在Ribbon中添加新控件(针对用户自定义Tab)

    前面我们实现了向用户自定义的Tab中添加新的Group,并向其中创建了两个Button按钮.这里我们看看如何向这个已经创建好的Group中再另外添加新的Button控件(当然,你可以添加其它控件,实现 ...

  5. VS2010中添加Flash控件

     一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player ...

  6. C# 中添加chart 控件

    C# 中的chart 控件并不是VC编译器自带的控件,但是它拥有画图的能力,例如柱形图.饼状图.折线图,等等: 1.在网上下载mschart 的安装包:并执行安装文件: https://downloa ...

  7. Silverlight 游戏开发:可重用的拖拽控件

    游戏中有各种各样的拖拽需求,大到窗口,小到图标,在游戏界面操作中,点击和拖拽占据了用户操作的大部分行为,如何做好一个拖拽控件至关重要,做一个可重用的拖拽控件更加重要,我的这些实现方法可能比较另类,但只 ...

  8. 关于 Repeater 控件嵌套的使用。在嵌套中添加 其它控件(如:按钮),并影响其它控件的方法,很重要哦,测试通过。...

    这里的Repeater 嵌套,是指在 外层的Repeater的 ItemTemplate 中 又添加了一个 Repeater ,并且在两层的Repeater中都添加了一个Button控件.我们要实现两 ...

  9. iOS中在NavigationController的toolbar中添加Segment控件

    2019独角兽企业重金招聘Python工程师标准>>> 昨天本来想在Navigation的Toolbar里面添加一个Segment控件,没想到一添加就跑到上面的视图上去,愁死了.后来 ...

最新文章

  1. 近期活动盘点:首届Apache Flink 极客挑战赛、2019年社会计算机国际会议
  2. 过早扩张、未经检验的技术,创业公司最易跳入哪些致命陷阱?
  3. EF mysql 数据迁移_EF Code First Migrations数据库迁移
  4. 在java中将数据信息写入本地文本(1)
  5. 计算机中丢失vcomp140.dll,Vcomp140.dll文件
  6. Qt Creator定位项
  7. 【51单片机快速入门指南】4.4.3:Madgwick AHRS 九轴姿态融合获取四元数、欧拉角
  8. 语义级代码克隆检测数据集的评估与改进
  9. java和python和php_Java、Python和PHP三者的区别
  10. fragment--总结
  11. [IOS]——播放器AVPlayer的实现
  12. ADS实验报告二:滤波器的仿真设计
  13. 优化问题---切线、切向量、切平面;法线,法向量,法平面
  14. c语言选猴王链表,C语言程序设计-猴子选大王[链表应用]
  15. 台式计算机调亮度快捷键,台式电脑怎么调节屏幕亮度
  16. 集合:List接口:ArrayList,LinkedList Set接口:HashSet
  17. hids Elastic Security 系列1-Elastic Security介绍
  18. 电流反馈和电压反馈的判断
  19. 解码者:数学探秘之旅——读书笔记(一)
  20. 计算机毕业大学生如何解决难就业问题?

热门文章

  1. Redlock原理简介和实现过程
  2. 中文设置_lol手游台服怎么设置中文?lol手游台服中文的具体设置教程
  3. Java 并发编程概念深入理解
  4. 装载鸿蒙系统,华为3-4月份将正式推送鸿蒙系统 第三方装载量也将达到一个亿...
  5. Spring解决循环依赖
  6. Docker容器的单进程模型
  7. css点滴知识汇集(转+编辑)
  8. C语言编译器不检查数组下标越界
  9. navicat 结合快捷键 非常好用
  10. 大厂十年研发经历,总结了12条安卓开发条经验