原文: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. Java8 Lambda使用指南

    Java8 Lambda 的使用指南 原文地址:https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#s ...

  2. django removing hardcoded URLs in template --- 使用变量,把url放在变量中 {% url 'namespace:name' %}

    urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^votes/', include("polls.urls", na ...

  3. vue中使用vue-i18n 一个简单的国际化操作

    1.安装:npm install vue-i18n --save-dev 2.在main.js文件中引入: import VueI18n from 'vue-i18n' Vue.use(VueI18n ...

  4. [C/C++] _tprintf() 输出不了汉字

    在前面加一个 setlocale(LC_ALL, ""); //必须得有这行 否则不能输出中文 注意得加locale头文件 #include<stdio.h> #inc ...

  5. 《实战Java高并发程序设计》读书笔记五

    第五章 并行模式与算法 1.单例模式 是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统一个类只产生一个实例. 对于频繁创建使用的对象可以省略new 操作花费的时间,可以减少系统开销. 由 ...

  6. 【C语言】创建一个函数,将输入的2个数排序

    #include <stdio.h> void fun(int *x,int*y) { int t; if(*x>=*y) { t=*x;*x=*y;*y=t; } } main() ...

  7. 解决STM32工程出现:Undefined symbol TIM_ClearFlag (referred from hcsr04.o).错误。类型问题Undefined symbol TIM_xxx (referred from xxx.o).

    出错原因: 工程FWLIB目录下没有添加stm32f10x_tim.c文件. 添加即可. 一般利用库开发,将ppp.c(ppp.c又调用了库stm32f10x_xx.h)写好之后的调用步骤: 举例使用 ...

  8. 29 对象&函数

    switch: 穿越: 没有判断结果的情况下执行下一个case的语句块,叫穿越 或者穿越: switch(s%10){ case 1: case 2: case 3: s++; break; defa ...

  9. 吴裕雄 python 神经网络——TensorFlow 花瓣识别2

    import glob import os.path import numpy as np import tensorflow as tf from tensorflow.python.platfor ...

  10. node.js+mysql环境搭建

    https://www.jianshu.com/p/9b338095cbe8 node.js+mysql环境搭建 0x01 前言 随着html web技术的发展,和全栈式开发的需求,对于前端人员来讲, ...