欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上

程序员文章站 2022-04-02 15:58:16
...

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

 

先看效果:

 

Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上
            
    
    博客分类: Android游戏开发学习 SurfaceViewButtonAndroid 


Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上
            
    
    博客分类: Android游戏开发学习 SurfaceViewButtonAndroid 

 


注意:你实现的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) {}
}
 

 

源码下载:

 

 

 

 

  • Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上
            
    
    博客分类: Android游戏开发学习 SurfaceViewButtonAndroid 
  • 大小: 78.8 KB
  • Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上
            
    
    博客分类: Android游戏开发学习 SurfaceViewButtonAndroid 
  • 大小: 54.8 KB