zoukankan      html  css  js  c++  java
  • Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上

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

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

    先看效果:


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

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

    Java代码  收藏代码
    1. public GameSurfaceView(Context context, AttributeSet attrs){  
    2.     super(context,attrs);  
    3. }  
    Java代码  收藏代码
    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中去绑定,这里需要注意

    Java代码  收藏代码
    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中是相对布局

    Java代码  收藏代码
    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.          
    7.        <dk.game.GameSurfaceView android:id="@+id/gameView"  
    8.            android:layout_width="fill_parent"  
    9.            android:layout_height="fill_parent"/>  
    10.       
    11.        <Button  
    12.            android:id="@+id/nextBt"  
    13.            android:layout_width="wrap_content"  
    14.            android:layout_height="wrap_content"  
    15.            android:layout_alignParentRight="true"  
    16.            android:layout_alignParentBottom="true"  
    17.            android:text="下一张"   
    18.            android:onClick="nextBt" />  
    19.          
    20.        <Button  
    21.            android:id="@+id/preBt"  
    22.            android:layout_width="wrap_content"  
    23.            android:layout_height="wrap_content"  
    24.            android:layout_toLeftOf="@id/nextBt"  
    25.            android:layout_alignParentBottom="true"  
    26.            android:text="上一张"   
    27.            android:onClick="preBt" />  
    28.          
    29. </RelativeLayout>  
     

    GameSurfaceView类的源码如下

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

    源码下载:

  • 相关阅读:
    boost库在windows下的编译和使用
    【转】VMware设置共享文件夹之后Ubuntu中看不到怎么办?
    ffmpeg常用命令
    虚函数和纯虚函数的作用与区别
    PJSIP UA分析
    PJSIP在windows(xp或者win7)下的编译,编译工具是vs2008,PJSIP版本2.3
    live555源码研究(十)------在编译过程中遇到的问题及解决方法
    live555源码研究(五)------DynamicRTSPServer类
    live555源码研究(四)------UserAuthenticationDatabase类
    web响应式图片设计实现
  • 原文地址:https://www.cnblogs.com/mochaMM/p/5113599.html
Copyright © 2011-2022 走看看