Android 游戏开发(一)了解View

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;
}

 

这样就可以实现想要的效果了,^_^是不是很简单!感谢百度提供的一些资料!

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。