首先正式在制作飞机打战之前我们先把所需的图片导入Android Studio中放在app/main/res/dawable/,目录下;(导入的方法直接复制图片,之后选中dawable文件夹粘贴即可)
主界面总体包括:
一.GameSurface类
内有包括:
1.画图所需的属性
//
画图
private
SurfaceHolder
surfaceHolder
;
//
包装类
private
Canvas
canvas
;
//
画布
private
Paint
paint
;
//
画笔
//
与屏幕坐标
public static int
screenWidht
;
//
屏幕宽度
public static int
screenHight
;
//
屏幕高度
//Menu
相关的 图片元素
private
GameMenu
gameMenu
;
private
Bitmap
bmpMenuBG
;
//
背景图片
private
Bitmap
bmpMenuLogo
;
//
菜单页面
Logo
private
Bitmap
bmpMenuButton
;
//
菜单页面按钮
private
Bitmap
bmpMenuTxt
;
2.继承extends
SurfaceView类时需要重写的
GameSurface(Context context)类
public
GameSurface(Context context) {
super
(context);
surfaceHolder
=
this
.getHolder();
//
初始化
holder(
类似于工具)
surfaceHolder
.addCallback(
this
);
//
回调函数
paint
=
new
Paint();
//
初始化画笔
paint
.setAntiAlias(
true
);
//
抗锯齿
}
3.实现
surfaceCreated
.Callback接口时会产生(三个方法),将
(SurfaceHolder holder)类进行重写了 ,
添加一个主线程
(new Thread)。
@Override
public void
surfaceCreated(SurfaceHolder holder) {
screenWidht
=
this
.getWidth();
screenHight
=
this
.getHeight();
initBitmap();
new
Thread(
new
Runnable() {
@Override
public void
run() {
MyDraw();
}
}).start();
}
4,初始化画图工具方法MyDraw()
,
/**
*
绘图方法
*/
private void
MyDraw() {
//
画布锁定初始化
canvas
=
surfaceHolder
.lockCanvas();
gameMenu
.drow(
canvas
,
paint
);
//
实例化的
gameMenu
调用
drow
方法画出图片
if
(
canvas
!=
null
) {
surfaceHolder
.unlockCanvasAndPost(
canvas
);
}
}
5.initBitmap(),初始化图片元素的方法
把图片转化成BitmapFactory类型的图片
private void
initBitmap() {
//
把图片转化成
BitmapFactory
bmpMenuBG
= BitmapFactory.
decodeResource
(
this
.getResources(), R.drawable.
mainmenu
);
bmpMenuButton
= BitmapFactory.
decodeResource
(
this
.getResources(), R.drawable.
menustart
);
bmpMenuTxt
= BitmapFactory.
decodeResource
(
this
.getResources(), R.drawable.
starttext
);
bmpMenuLogo
= BitmapFactory.
decodeResource
(
this
.getResources(), R.drawable.
logo
);
//
初始化
gameMenu
=
new
GameMenu(
bmpMenuBG
,
bmpMenuLogo
,
bmpMenuButton
,
bmpMenuT
xt
);
}
完成后:
package
com.example.gamemean;
import
android.content.Context;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
android.graphics.Canvas;
import
android.graphics.Paint;
import
android.icu.util.Calendar;
import
android.os.Build;
import
android.support.annotation.RequiresApi
;
import
android.view.Menu;
import
android.view.SurfaceHolder;
import
android.view.SurfaceView;
/**
* Created by
小泽
on 2017/5/24.
*/
@RequiresApi
(api = Build.VERSION_CODES.
N
)
public class
GameSurface
extends
SurfaceView
implements
SurfaceHolder.Callback {
private
SurfaceHolder
surfaceHolder
;
//
包装类
private
Canvas
canvas
;
//
画布
private
Paint
paint
;
//
画笔
public static int
screenWidht
;
//
屏幕宽度
public static int
screenHight
;
//
屏幕高度
//Menu
相关的
private
GameMenu
gameMenu
;
private
Bitmap
bmpMenuBG
;
//
背景图片
private
Bitmap
bmpMenuLogo
;
//
菜单页面
Logo
private
Bitmap
bmpMenuButton
;
//
菜单页面按钮
private
Bitmap
bmpMenuTxt
;
public
GameSurface(Context context) {
super
(context);
surfaceHolder
=
this
.getHolder();
//
初始化
holder(
类似于工具)
surfaceHolder
.addCallback(
this
);
//
回调函数
paint
=
new
Paint();
//
初始化画笔
paint
.setAntiAlias(
true
);
//
抗锯齿
}
@Override
public void
surfaceCreated(SurfaceHolder holder) {
screenWidht
=
this
.getWidth();
screenHight
=
this
.getHeight();
initBitmap();
new
Thread(
new
Runnable() {
@Override
public void
run() {
MyDraw();
}
}).start();
}
@Override
public void
surfaceChanged(SurfaceHolder holder,
int
format,
int
width,
int
height) {
}
@Override
public void
surfaceDestroyed(SurfaceHolder holder) {
}
/**
*
绘图方法
*/
private void
MyDraw() {
//
画布锁定初始化
canvas
=
surfaceHolder
.lockCanvas();
gameMenu
.drow(
canvas
,
paint
);
//
实例化的
gameMenu
调用
drow
方法画出图片
if
(
canvas
!=
null
) {
surfaceHolder
.unlockCanvasAndPost(
canvas
);
}
}
private void
initBitmap() {
//
把图片转化成
BitmapFactory
bmpMenuBG
= BitmapFactory.decodeResource(
this
.getResources(), R.drawable.
mainmenu
);
bmpMenuButton
= BitmapFactory.decodeResource(
this
.getResources(), R.drawable.
menustart
);
bmpMenuTxt
= BitmapFactory.decodeResource(
this
.getResources(), R.drawable.
starttext
);
bmpMenuLogo
= BitmapFactory.decodeResource(
this
.getResources(), R.drawable.
logo
);
//
初始化
gameMenu
=
new
GameMenu(
bmpMenuBG
,
bmpMenuLogo
,
bmpMenuButton
,
bmpMenuTxt
);
}
}
二.GameMenu类
package
com.example.gamemean;
import
android.graphics.Bitmap;
import
android.graphics.Canvas;
import
android.graphics.Paint;
import
android.graphics.Rect;
/**
* Created by
小泽
on 2017/5/24.
*/
public class
GameMenu {
private
Bitmap bmpMenuBG;
//
背景图片
private
Bitmap
bmpMenuLogo
;
//
菜单页面
Logo
private
Bitmap
bmpMenuButton
;
//
菜单页面按钮
private
Bitmap
bmpMenuTxt
;
//
菜单页面文本
private
Rect
rect
;
//
创建一个长方形,放置飞机大战
LOGO,
因为
logo
图片过大,所以先填充一个长方体
//
构造函数初始化
public
GameMenu(Bitmap bmpMenuBG, Bitmap bmpMenuLogo, Bitmap bmpMenuButton, Bitmap bmpMenuTxt) {
this
.bmpMenuBG = bmpMenuBG;
this
.
bmpMenuButton
= bmpMenuButton;
this
.
bmpMenuLogo
= bmpMenuLogo;
this
.
bmpMenuTxt
= bmpMenuTxt;
rect
=
new
Rect(
0
, GameSurface.
screenHight
/
3
, GameSurface.
screenWidht
,
GameSurface.
screenHight
/
3
+ GameSurface.
screenHight
/
5
);
//
此处三个参数
}
/**
*
画图
*
* @param
canvas
* @param
paint
*/
public void
drow(Canvas canvas, Paint paint) {
//
菜单背景
canvas.drawBitmap(bmpMenuBG,
0
,
0
, paint);
//
画飞机大战
logo
,放入长方形中
canvas.drawBitmap(
bmpMenuLogo
,
null
,
rect
, paint);
//
画按钮
int
x = GameSurface.
screenHight
/
3
*
2
;
int
y = GameSurface.
screenWidht
/
2
-
bmpMenuButton
.getWidth() /
2
;
canvas.drawBitmap(
bmpMenuButton
, y, x, paint);
//
画文本
int
m = y +
bmpMenuButton
.getWidth() /
6
;
int
n = x +
bmpMenuButton
.getHeight() /
6
;
canvas.drawBitmap(
bmpMenuTxt
, m, n, paint);
//
}
}
注意:
个元素坐标需要进行调试
三.MainActivity类
package
com.example.gamemean;
import
android.os.Build;
import
android.support.annotation.RequiresApi
;
import
android.support.v7.app.AppCompatActivity;
import
android.os.Bundle;
public class
MainActivity
extends
AppCompatActivity {
@RequiresApi
(api = Build.VERSION_CODES.
N
)
@Override
protected void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(
new
GameSurface(
this
));
}
}