Android图形界面编程一

游戏开发,对我来说是一个很陌生但是又很期待的东东,都说游戏行业最挣钱,但是自己现在的工作方向还是应用开发,是不是学习游戏开发就有点多余了呢?实际上在应用开发中也会经常会用到游戏的一些绘制技术,所以,学习游戏开发是为自己的应用开发加分的,当然如果以后有机后做一款属于自己的游戏软件,那当然也为尝不可啦,言归正传,从今天开始,会正式进入android游戏开发学习之旅啦!

对于android应用开发,是自己比较擅长的,而在应用开发中的界面,基本都是用系统提供的组件(如:TextView、EditText等)来进行搭建的,并且布局文件都是在xml进行配置的,但是在游戏开发中,如果还是用系统组件的形式去做的话,那将会非常吃力,为什么呢?因为游戏开发中往往有一些滚屏效果,碰撞检测等,用组件的方式是不好去控制的,所以,对于界面的搭建,就得以纯代码的形式去让界面呈现出来,而抛弃做应用时用的xml的方式,好了,说了一大堆前言,下面正式进入主题。

对于应用开发中,我们都知道View这个类,是所有组件的基类,这里就不多赘述了,下面截个层次图来了解下它:

所以,要用代码去控制界面,就得从继承它开始,对于View这个类而言,首先它最主要的作用应该是界面的显示,对应的方法为:

另外光显示肯定不行,得与用户进行人机交互,这时就会有一些按键触屏的之类的事件响应了,对应的方法为:

说明:关于View的其它自定义界面的常用方法,会在之后研究系统组件时一一剖析,由于现在在游戏开发阶段还不需用到】

 接下来一步步循序渐进地来学习如何用代码来搭建自己的界面,新建一个工程,并创建一个继承至View的类用于自定义界面:

MyView.java【里面的内容主要是熟悉View的一些常用方法】:

public class MyView extends View {

    public MyView(Context context) {
        super(context);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        System.out.println("onDraw");
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        System.out.println("onKeyDown");
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        System.out.println("onKeyUp");
        return super.onKeyUp(keyCode, event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.out.println("onTouchEvent");
        return super.onTouchEvent(event);
    }
}

而在Activity中,替换我们要显示的View

MainActivity:

public class MainActivity extends Activity {

    private MyView myView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myView = new MyView(this);
        setContentView(myView);
    }

}

这时运行,看一下其用户事件响应情况:

点击触屏会响应onTouchEvent,那如果是点击按键呢?

预期的onKeyDown、onKeyUp事件没有响应,这是为神码呢?这里需要修改一下MainActivity:

public class MainActivity extends Activity {

    private MyView myView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myView = new MyView(this);
        myView.setFocusable(true);
        setContentView(myView);
    }

}

这时,再来看一下:

这时,按键事件就正常响应了。关于android的事件分发之制,会找个专题专门研究下,这里先暂且知道用这种方式来解决按钮事件的响应问题。

对于View来讲,其实它最重要的功能就是把界面绘制给用户看,所以,上面回调方法中的onDraw()方法,就是专门干这事的,对于这个方法,对于应用开发的人来说并非很陌生,用法基本上也熟知,而游戏开发中,必不可少的需要用到它,所以接下来来对它进行一个介绍,会结合实例,但是并非所有的API都会介绍,因为在实际游戏开发中,用到的可能经常是绘制图片相关的,所以这里只是介绍跟游戏相关的东东:

首先比较简单的是绘制一条线,通过它,就能熟悉绘制的基本使用,先看一下绘制线的API定义:

而对于绘制的所有方法,都是由Canvas提供的,Canvas可以理解为一个画板,我们所有的东东都是绘制在上面的。在绘制横线之前还得看一个东西:

纵览一下它提供的API,你就能对它的用处有一个比较清晰的概念:

那思考一下,Canvas和Paint对象是一种什么关系呢?我觉得博主这篇说得比较清楚:http://blog.sina.com.cn/s/blog_6f74890d01018qr4.html,我再来用windows上自带的画图工具来对这两个对象进一步阐述下,以便在使用它们之前,知道他们的作用后在今后使用时,就不会用错了:

而接下来,我们来绘制一条线:

这时,进行绘制效果如下:

清楚了两者间的关系后,接下来到Canvas来找绘制横线的方法:

代码框架还是基于上面的,MyView的代码如下:

public class MyView extends View {

    private Paint paint;

    public MyView(Context context) {
        super(context);
        paint = new Paint();
        paint.setAntiAlias(true);// 必须设置抗锯齿,这样绘制出来的画面才会是平滑的
        paint.setColor(Color.RED);// 设置画笔的颜色为红色
        paint.setStyle(Paint.Style.STROKE);// 设置画笔的样式
        paint.setStrokeWidth(2);// 设置画笔的粗细
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawLine(0, 0, 100, 100, paint);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        System.out.println("onKeyDown");
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        System.out.println("onKeyUp");
        return super.onKeyUp(keyCode, event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.out.println("onTouchEvent");
        return super.onTouchEvent(event);
    }
}

运行结果:

如果我们将Paint中的粗度调大呢?

再次运行:

说明:关于程序中设置Paint的style为STROKE的含义,可以参考该文章:http://blog.163.com/hades_06/blog/static/170366746201252263517535/】

二十六 (13:36)

posted on 2014-02-17 22:40  cexo  阅读(2824)  评论(0)    收藏  举报

导航