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

简介:

 各位童鞋请你们注意:surfaceview中确实有 onDraw这个方法,但是surfaceview不会自己去调用!!!

而我代码中的ondraw 也好 draw 也好,都是我自己定义的一个方法。。。放在线程中不断调用的,一定要注意!! 

     昨天圣诞节,没有出去,而是一天时间全部纠结在如何在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. <?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> 

    以上代码很简单,都是一些布局方式和各个组件一些属性及显示方式的设定,当然主要看如何对我们的SurfaceView如何注册在xml中的,那么每个组件都有id这样为了对后面其交互数据用到,因为我们要对每个组件操作,所以这里都索引了id方面从R文件中取出其对象。

     那么,xml我们定义好了,看看代码中如何实现的,这里先说下Activity类中代码: 


  
  
  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.     }  

    该有的备注在代码后面都备注了,MySurfaceView.button_str,这个是自己的SurfaceView中定义的一个static 的变量用来交互数据用到;在那么下面就要看我们的SurfaceView,当在Xml注册需要注意什么了,我半天的时候都花在了这里!!!一定要引起注意,这也是在SurfaceView中并显示组件完成最重要的一步。 

先分析:

    1.SurfaceView类的创建和实现等等和之前都是一样的,该怎么去写还怎么去写,但是!构造函数一定要注意! 


  
  
  1. /*  
  2.      * public MySurfaceView(Context context) { super(context); }//备注1(这里一定要引起注意,仔细看下文对备注1的解释 )  
  3.      */  
  4. 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中去绑定,这里需要注意下; 

下面分享出源码: 

源码下载地址: http://www.himigame.com/android-game/306.html










本文转自 xiaominghimi 51CTO博客,原文链接:,如需转载请自行联系原作者
目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1292 4
|
6月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
426 11
|
8月前
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
2086 2
|
11月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
728 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
前端开发 Android开发 图形学