原文:http://daikainan.iteye.com/blog/1407355

实现Button悬浮于与SurfaceView之上实现

先看效果:

注意:你实现的SurfaceView和android中的Button,EditView是同级的,不能把一个包含在另一个里面

1.创建自己的SurfaceView类,一定要实现2个参数的那个函数,因为你要在XMl中使用,第二个参数指的自定义的组件的一些属性长宽等。

  1. public GameSurfaceView(Context context, AttributeSet attrs){
  2. super(context,attrs);
  3. }
  1. <dk.game.GameSurfaceView android:id="@+id/gameView"
  2. android:layout_width="fill_parent"
  3. android:layout_height="fill_parent"/>

2.处理SurfaceView中事件一定要在Activity中。我们在xml中定义我们的surfaceview 和 组件button、textview等等的时候 他们是同一级别的!!而不是把button包含在surfaceview里,所以虽然在surfaceview中可以根据id索引到button但绑定的时候是无法找到button的,只有我们的 activitysetContentView(R.layout.main); 显示的button,所以只能在显示它的activity中去绑定,这里需要注意

  1. @Override
  2. public void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. requestWindowFeature(Window.FEATURE_NO_TITLE);
  5. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  6. setContentView(R.layout.main);
  7. }
  8. /**
  9. * 下一张按钮事件
  10. * @param view
  11. */
  12. public void nextBt(View view){
  13. GameSurfaceView.cn=2;
  14. }
  15. /**
  16. * 上一张按钮事件
  17. * @param view
  18. */
  19. public void preBt(View view){
  20. GameSurfaceView.cn=1;
  21. }

3.在Layout中是相对布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/relativeLayout1"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent" >
  6. <dk.game.GameSurfaceView android:id="@+id/gameView"
  7. android:layout_width="fill_parent"
  8. android:layout_height="fill_parent"/>
  9. <Button
  10. android:id="@+id/nextBt"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_alignParentRight="true"
  14. android:layout_alignParentBottom="true"
  15. android:text="下一张"
  16. android:onClick="nextBt" />
  17. <Button
  18. android:id="@+id/preBt"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:layout_toLeftOf="@id/nextBt"
  22. android:layout_alignParentBottom="true"
  23. android:text="上一张"
  24. android:onClick="preBt" />
  25. </RelativeLayout>

GameSurfaceView类的源码如下

  1. package dk.game;
  2. import android.content.Context;
  3. import android.content.res.Resources;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Paint;
  9. import android.util.AttributeSet;
  10. import android.util.Log;
  11. import android.view.SurfaceHolder;
  12. import android.view.SurfaceView;
  13. public class GameSurfaceView extends SurfaceView implements Runnable ,SurfaceHolder.Callback{
  14. private Thread gameViewThread;
  15. private SurfaceHolder surfaceHolder;
  16. private Paint paint;
  17. private boolean runFlag=false;
  18. public static int screen_width,screen_height;
  19. protected Resources resources;
  20. private Canvas canvas;
  21. private Bitmap bmp_bg1,bmp_bg2;
  22. public static int cn=1;
  23. public GameSurfaceView(Context context, AttributeSet attrs){
  24. super(context,attrs);
  25. init();
  26. }
  27. public GameSurfaceView(Context context) {
  28. super(context);
  29. init();
  30. }
  31. private void init(){
  32. surfaceHolder=getHolder();
  33. surfaceHolder.addCallback(this);
  34. resources=getResources();
  35. paint=new Paint();
  36. paint.setAntiAlias(true);
  37. bmp_bg1=BitmapFactory.decodeResource(getResources(), R.drawable.bg1);
  38. bmp_bg2=BitmapFactory.decodeResource(getResources(), R.drawable.bg2);
  39. //  setFocusable(true);
  40. //  setFocusableInTouchMode(true);
  41. //  setClickable(true);
  42. setKeepScreenOn(true);
  43. }
  44. public void draw(Canvas canvas,Paint paint){
  45. canvas.drawColor(Color.BLACK);
  46. if(cn==1){
  47. canvas.drawBitmap(bmp_bg1, 0,0, paint);
  48. }else if(cn==2){
  49. canvas.drawBitmap(bmp_bg2, 0,0, paint);
  50. }
  51. }
  52. @Override
  53. public void run() {
  54. while(runFlag){
  55. try{
  56. canvas=surfaceHolder.lockCanvas();
  57. long startTime=System.currentTimeMillis();
  58. canvas.drawColor(Color.BLACK);
  59. draw(canvas,paint);
  60. long endTime=System.currentTimeMillis();
  61. if(50>(endTime-startTime)){
  62. Thread.sleep(50-(endTime-startTime));
  63. }
  64. }catch (Exception e) {
  65. Log.e("Error", "刷新屏幕出错!"+e);
  66. }finally{
  67. if(canvas!=null){
  68. surfaceHolder.unlockCanvasAndPost(canvas);
  69. }
  70. }
  71. }
  72. }
  73. @Override
  74. public void surfaceCreated(SurfaceHolder holder) {
  75. screen_width=getWidth();
  76. screen_height=getHeight();
  77. runFlag=true;
  78. gameViewThread=new Thread(this);
  79. gameViewThread.start();
  80. }
  81. @Override
  82. public void surfaceDestroyed(SurfaceHolder holder) {
  83. runFlag=false;
  84. }
  85. @Override
  86. public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}
  87. }

源码下载:

Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上的更多相关文章

  1. [Android游戏开发学习笔记]View和SurfaceView

    本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在A ...

  2. Android应用开发学习之表格视图

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 本文我们来学习一个使用表格视图的程序,下图是该程序的运行效果: 该程序主Activity文件内容如下: packag ...

  3. Android游戏开发实践(1)之NDK与JNI开发04

    Android游戏开发实践(1)之NDK与JNI开发04 有了前面几篇NDK与JNI开发相关基础做铺垫,再来通过代码说明下这方面具体的操作以及一些重要的细节.那么,就继续NDK与JNI的学习总结. 作 ...

  4. 《Android游戏开发详解》一1.7 控制流程第1部分——if和else语句

    本节书摘来异步社区<Android游戏开发详解>一书中的第1章,第1.7节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.7 ...

  5. 2021年正确的Android逆向开发学习之路

    2021年正确的Android逆向开发学习之路 说明 文章首发于HURUWO的博客小站,本平台做同步备份发布.如有浏览或访问异常或者相关疑问可前往原博客下评论浏览. 原文链接 2021年正确的Andr ...

  6. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  7. Android游戏开发实践(1)之NDK与JNI开发01

    Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...

  8. Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

  9. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

随机推荐

  1. AxureRP 9安装、激活、汉化

    AxureRP安装 AxureRP激活 AxureRP汉化

  2. 手码两万余字,SpringMVC 包教包会

    1. SpringMVC 简介 1.1 Spring Web MVC是什么 Spring Web MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级 Web 框架, ...

  3. ios中ipa包的发布平台

    目前我所知的平台 1.蒲公英 目前 限制  金融类app  区块链类app的上传,小编的号因此刚被封号,而且交涉无果,不给解封,只有提交工单,包号注销了,再注册一个[建议看一下使用规则] 小编认为, ...

  4. Plastic Bottle Manufacturer Profile: Plastic Bottle Forming Process

    Plastic bottle molding refers to the process of making a final plastic product from a polymer produc ...

  5. MySQL双机热备环境搭建

    一.    前期准备 准备两台服务器(电脑),接入到同一局域网中,能够使双方可以ping通: 安装MySQL数据库,具体安装方法网上很全面,但是安装的版本需保持一致: 服务器IP地址设置. l  A服 ...

  6. java平衡二叉树AVL数

    平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树 右旋:在插入二叉树的时候,根节点的右侧高 ...

  7. python manage.py shell

    启动python有两种方式:python manage.py shell和python. 这两个命令 都会启动交互解释器,但是manage.py shell命令有一个重要的不同: 在启动解释器之前,它 ...

  8. BFS(广度优先搜索遍历保存全局状态,华容道翻版做法)--08--DFS--蓝桥杯青蛙跳杯子

    题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...

  9. PHP将json或对象转成数组

    今天老大突然给了我一个小任务,给我一个txt文件,里边是很多的json字串,要求将这些字串转换成php中的数组: 于是开足火力,用了将进5分钟的时间完成了任务,代码如下: $jsonStr = fil ...

  10. python学习笔记:分支 与 循环

    if 语句 if 条件: ...... # 条件为真的时候,执行缩进的代码 if 条件: ...... # 条件为真的时候执行 else: ...... # 条件为假的时候执行 if 条件1: ... ...