实现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) {}
}
源码下载:
- 大小: 78.8 KB
- 大小: 54.8 KB
分享到:
相关推荐
android之surfaceview游戏开发
android之surfaceview学习示例
Android---SurfaceView 实现简单的SurfaceView动画效果 简单说明Surface动画的实现过程和原理 详细注解,说明关键代码的作用
使用SurfaceView来进行地图绘制,实现的功能有: 1. 双击放大 2. 多点触摸放大 3. 地图拖拽 4. 添加地图标记
Android中使用surfaceview开发的Camera相机,内容含有注释,非常清楚
1.Android游戏开发之旅一 长按Button原理 2.Android游戏开发之旅二 View和SurfaceView 3.Android游戏开发之旅三 View类详解 4.Android游戏开发之旅四 Canvas和Paint实例 5.Android游戏开发之旅五 Path和Typeface...
Android游戏框架SurfaceView介绍 PDF TAG:Android 游戏框架 SurfaceView
Android的SurfaceView实现图片缩放、滑动,网上资源不多,目前还有些问题,仅供参考。
Android游戏开发一 长按Button原理 Android游戏开发二 View和SurfaceView Android游戏开发三 View类详解 Android游戏开发四 Canvas和Paint实例 Android游戏开发五Path和Typeface Android游戏开发六 自定义View ...
android-SurfaceView 游戏测试Demo
SurfaceView游戏框架实例,讲解如何使用,如何掌握基础性东西
Android SurfaceView 实现实时显示摄像头视频,详见博客:https://blog.csdn.net/qq_30297763/article/details/90241102
使用VideoView播放视频简单、方便,但有些早期的开发者还是更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此它没有提供图像输出界面,此时就需要借助于SurfaceView来显示MediaPlayer播放...
Android SurfaceView实现动画效果
Android 构建游戏框架View与SurFaceView的区别
Android多媒体开发06-SurfaceView框架.ppt
NULL 博文链接:https://daikainan.iteye.com/blog/1406990
Android SurfaceView实现加载GIF动画