Android游戏当中主要的除了控制类外就是显示类View。SurfaceView是从View基类中派生出来的显示类。android游戏开发中常用的三种视图是:view、SurfaceView和GLSurfaceView。
View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢。
SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。
GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图;是SurfaceView的子类,openGL专用。
在2D游戏开发中,大致可以分为两种游戏框架,View和SurfaceView。 View和SurfaceView区别:
View:必须在UI的主线程中更新画面,用于被动更新画面。
SurfaceView:UI线程和子线程中都可以。在一个新启动的线程中重新绘制画面,主动更新画面。
什么是Paint?要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上。Android 中的画笔是 Paint类。
什么是Canvas?
当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了。在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西。除了在画布上绘制之外,还需要设置一些关于画布的属性,比如,画布的颜色、尺寸等。
游戏中Avitivy基本会设置成无标题。
public class BeginActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //隐去标题栏 this.requestWindowFeature(Window.FEATURE_NO_TITLE); //隐去状态栏部分,包括电池等图标 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(new MyView(this)); } }
有了基础知识下面来写一些文字,下面是要实现文字跟随手移动。
import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.MotionEvent; import android.view.View; public class MyView extends View { private int posX = 50; private int posY = 50; public MyView(Context context) { super(context); this.setBackgroundColor(Color.BLACK); this.setFocusableInTouchMode(true); } @Override protected void onDraw(Canvas canvas) { Paint mPaint = new Paint(); mPaint.setColor(0xffffffff); mPaint.setTextSize(50); canvas.drawText("Game", posX, posY, mPaint); super.onDraw(canvas); } //触摸事件 @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { //按下 case MotionEvent.ACTION_DOWN: posX = x; posY = y; break; //移动 case MotionEvent.ACTION_MOVE: posX = x; posY = y; break; //弹出 case MotionEvent.ACTION_UP: posX = x; posY = y; break; default: break; } invalidate(); return super.onTouchEvent(event); } }
上面的代码是无法实现文字跟随文字移动,因为在MOVE这个Action中super.onTouchEvent事件中途会返回false。导致后面的event动作可能就会收不到了。
应该让监听函数的返回值永远为true。
//代码修改 @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); posX = x; posY = y; invalidate(); return true; }
这样就可以实现想要的效果了,^_^是不是很简单!感谢百度提供的一些资料!