Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上
原文:http://daikainan.iteye.com/blog/1407355
实现Button悬浮于与SurfaceView之上实现
先看效果:


注意:你实现的SurfaceView和android中的Button,EditView是同级的,不能把一个包含在另一个里面
1.创建自己的SurfaceView类,一定要实现2个参数的那个函数,因为你要在XMl中使用,第二个参数指的自定义的组件的一些属性长宽等。
- public GameSurfaceView(Context context, AttributeSet attrs){
- super(context,attrs);
- }
- <dk.game.GameSurfaceView android:id="@+id/gameView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
2.处理SurfaceView中事件一定要在Activity中。我们在xml中定义我们的surfaceview 和 组件button、textview等等的时候 他们是同一级别的!!而不是把button包含在surfaceview里,所以虽然在surfaceview中可以根据id索引到button但绑定的时候是无法找到button的,只有我们的 activitysetContentView(R.layout.main); 显示的button,所以只能在显示它的activity中去绑定,这里需要注意
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(R.layout.main);
- }
- /**
- * 下一张按钮事件
- * @param view
- */
- public void nextBt(View view){
- GameSurfaceView.cn=2;
- }
- /**
- * 上一张按钮事件
- * @param view
- */
- public void preBt(View view){
- GameSurfaceView.cn=1;
- }
3.在Layout中是相对布局
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/relativeLayout1"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- <dk.game.GameSurfaceView android:id="@+id/gameView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
- <Button
- android:id="@+id/nextBt"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_alignParentBottom="true"
- android:text="下一张"
- android:onClick="nextBt" />
- <Button
- android:id="@+id/preBt"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@id/nextBt"
- android:layout_alignParentBottom="true"
- android:text="上一张"
- android:onClick="preBt" />
- </RelativeLayout>
GameSurfaceView类的源码如下
- package dk.game;
- import android.content.Context;
- import android.content.res.Resources;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- public class GameSurfaceView extends SurfaceView implements Runnable ,SurfaceHolder.Callback{
- private Thread gameViewThread;
- private SurfaceHolder surfaceHolder;
- private Paint paint;
- private boolean runFlag=false;
- public static int screen_width,screen_height;
- protected Resources resources;
- private Canvas canvas;
- private Bitmap bmp_bg1,bmp_bg2;
- public static int cn=1;
- public GameSurfaceView(Context context, AttributeSet attrs){
- super(context,attrs);
- init();
- }
- public GameSurfaceView(Context context) {
- super(context);
- init();
- }
- private void init(){
- surfaceHolder=getHolder();
- surfaceHolder.addCallback(this);
- resources=getResources();
- paint=new Paint();
- paint.setAntiAlias(true);
- bmp_bg1=BitmapFactory.decodeResource(getResources(), R.drawable.bg1);
- bmp_bg2=BitmapFactory.decodeResource(getResources(), R.drawable.bg2);
- // setFocusable(true);
- // setFocusableInTouchMode(true);
- // setClickable(true);
- setKeepScreenOn(true);
- }
- public void draw(Canvas canvas,Paint paint){
- canvas.drawColor(Color.BLACK);
- if(cn==1){
- canvas.drawBitmap(bmp_bg1, 0,0, paint);
- }else if(cn==2){
- canvas.drawBitmap(bmp_bg2, 0,0, paint);
- }
- }
- @Override
- public void run() {
- while(runFlag){
- try{
- canvas=surfaceHolder.lockCanvas();
- long startTime=System.currentTimeMillis();
- canvas.drawColor(Color.BLACK);
- draw(canvas,paint);
- long endTime=System.currentTimeMillis();
- if(50>(endTime-startTime)){
- Thread.sleep(50-(endTime-startTime));
- }
- }catch (Exception e) {
- Log.e("Error", "刷新屏幕出错!"+e);
- }finally{
- if(canvas!=null){
- surfaceHolder.unlockCanvasAndPost(canvas);
- }
- }
- }
- }
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- screen_width=getWidth();
- screen_height=getHeight();
- runFlag=true;
- gameViewThread=new Thread(this);
- gameViewThread.start();
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- runFlag=false;
- }
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}
- }
源码下载:
- SurfaceViewActivity.rar (812.7 KB)
Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上的更多相关文章
- [Android游戏开发学习笔记]View和SurfaceView
本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在A ...
- Android应用开发学习之表格视图
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 本文我们来学习一个使用表格视图的程序,下图是该程序的运行效果: 该程序主Activity文件内容如下: packag ...
- Android游戏开发实践(1)之NDK与JNI开发04
Android游戏开发实践(1)之NDK与JNI开发04 有了前面几篇NDK与JNI开发相关基础做铺垫,再来通过代码说明下这方面具体的操作以及一些重要的细节.那么,就继续NDK与JNI的学习总结. 作 ...
- 《Android游戏开发详解》一1.7 控制流程第1部分——if和else语句
本节书摘来异步社区<Android游戏开发详解>一书中的第1章,第1.7节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.7 ...
- 2021年正确的Android逆向开发学习之路
2021年正确的Android逆向开发学习之路 说明 文章首发于HURUWO的博客小站,本平台做同步备份发布.如有浏览或访问异常或者相关疑问可前往原博客下评论浏览. 原文链接 2021年正确的Andr ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- Android游戏开发实践(1)之NDK与JNI开发01
Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...
- Android游戏开发实践(1)之NDK与JNI开发02
Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...
- 从一点儿不会开始——Unity3D游戏开发学习(一)
一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...
随机推荐
- AtCoder AGC038 C-LCMs 题解
题目链接:https://agc038.contest.atcoder.jp/tasks/agc038_c?lang=en 题意:给定一个数组,求这个数组中所有数对的LCM之和. 分析:网上看到了很多 ...
- 创业学习---《如何展开竞争情报调研》--D-1.调研模块---HHR计划---以太一堂
第一:<开始学习> 1,投资人看人标准:人品好:创业热情:学习能力. 2,思考题:请你预判一个最靠谱的方向来创业,你会怎么调研呢? 3,预热思考题: (1)在这个赛道,究竟有哪些重要竞争对 ...
- PLSQL Developer 连接多个数据库
1.新建一个Oracle的dblink 2.打开客户端instantclient目录,可能不是和PLSQL Developer 一个目录,然后用记事本编辑tnsnames.ora 3.把链接粘贴进去, ...
- java篇 之 继承
this代表正在使用类的对象(的引用) java支持重载:允许在同一个类中使用相同的方法名(重载类型只区分参数列表,包括参数 顺序,参数个数,参数数据类型,与方法返回类型无关) 匹配: 方法名 参数列 ...
- map遍历删除
List<Object> orderManageList = cacheService.values(key); Iterator<Object> it=orderManage ...
- 安卓之图像视图ImageView
一.有关属性说明 (1)scaleType:指定图形的拉伸类型,默认是fitCenter:拉伸类型的取值如下: (2)src:指定图形来源,src图形按照scaleType拉伸:背景图不按scaleT ...
- Centos610安装Nexus
1.下载Nexus 地址: https://pan.baidu.com/s/1D5AI6zmuRBSMK0k7j41VuQ 提取码: q50j 选择02-nexus 2.新建nexus账号 u ...
- Fluent_Python_Part3函数即对象,05-1class-func,一等函数,函数即对象
一等函数 一等函数即将函数看作一等对象.一等对象满足一下条件: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 1. 一等函数 例子1. 证明function是 ...
- svn服务器IP/URL地址更换,修改本地的仓库地址
TortoiseSVN服务器ip地址修改后如何使用_windows和linux下svn切换新仓库地址的方法 windows下svn切换仓库地址 右键项目文件夹 TortoiseSVN => Re ...
- Vim:Vim入门级配置
转:https://vimjc.com/vimrc-config.html Vim配置文件.vimrc Vim编辑器相关的所有功能开关都可以通过.vimrc文件进行设置. .vimrc配置文件分系统配 ...