上一篇的J2ME相信很多朋友都不是很感兴趣, 但是他的核心内容却很重要。
那么本篇就让我们来讲一下Android的内容。
终于要讲现代的平台咯~ 这里我们使用Android Studio来开发
开始:
首先使用Android Studio创建一个工程,得到我们程序的入口,也就是Activity。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //重要的方法
}
}
Activity创建好之后,可以看到这个入口实际上继承的是AppCompatActivity。AppCompatActivity这个类从命名Compat就可以看出,它的核心功能就是做兼容用的(这里我们讲的是游戏开发, 所以就不展开描述了)
。
下面为了讲起来方便, 统一使用Activity这个称呼来代替AppCompatActivity
程序启动的时候,系统会调用Activity
的onCreate()方法。官方建议我们是这个方法里进行一些初始化和使用setContentView(View)等一系列UI初始化操作。
开始之后,让我们回顾一下:
上一篇我们总结的所有游戏的开发套路是什么来着:
- 创建程序入口
- 把我们自己的界面设置为需要显示的界面
- 通过界面提供的图形调用接口来渲染, 并在可以进行绘制的地方进行绘制
既然我们已经把入口创建好了, 接下来就创建一个自己的界面.
从setContentView(View)
的参数可以看出,View就是我们需要继承实现的类.
创建一个界面
class MyView extends View{
public DrawView(Context context) {
super(context);
}
}
创建出来的View
里, 除了构造器外, 空无一物.
根据套路, 肯定会有一个方法, 是我们可以进行绘制的"场所".
从官方API里可以看出, onDraw(Canvas)就是我们要找的"场所".
Implementing a Custom View
To implement a custom view, you will usually begin by providing overrides for some of the standard methods that the framework calls on all views. You do not need to override all of these methods. In fact, you can start by just overriding onDraw(android.graphics.Canvas).
下面是我们实现的onDraw(Canvas)
:
class MyView extends View{
public DrawView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) { // 这里就是魔法开始的地方
super.onDraw(canvas);
}
}
有没有发现一个老朋友? 那就是Canvas, 它和J2ME里的Graphics
有点像, 也提供了很多绘图的方式.
在这里我还是想先画个矩形, 但我不知道该用什么方法, 我在Canvas的api里搜了下rect
, 搜到了一个熟悉的名字:
drawRect(float left, float top, float right, float bottom, Paint paint)
drawRect的格式和J2ME
里的drawRect基本一样, 不过多了一个Paint.
paint里提供了各种绘画图片,绘制图形,写文字需要用到的样式,颜色信息.
既然,我们已经获取到了画个矩形需要的知识, 那么开始操作吧:
开始绘图
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(Color.YELLOW); //设置一个黄色的画笔
canvas.drawRect(0,0,100,100,paint);//在坐标左上角(0,0),右下角(100,100)的地方发矩形
}
但光这样写出来, 并不能把画面展示出来, 我们还需要使用setContetView
把我们的View
放进去.
修改好Activity如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this)); //将原来的R.layout.activity_main替换为我们的View
}
}
运行后你就可以看到到效果了:
那要画个矩形框框呢?
Paint redStrokePaint = new Paint();
redStrokePaint.setColor(0xFFFF0000);// 16进制的颜色, Alpha, R, G, B
redStrokePaint.setStyle(Paint.Style.STROKE); //将样式改为线条
canvas.drawRect(100,200, 300,400, redStrokePaint); //在左上角在(100,200),右下角在(300,400)的地方画矩形
这个VIew的最终代码如下
class MyView extends View{
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(Color.YELLOW);
canvas.drawRect(0,0,100,100,paint);
Paint redStrokePaint = new Paint();
redStrokePaint.setColor(0xFFFF0000);
redStrokePaint.setStyle(Paint.Style.STROKE);
canvas.drawRect(100,200, 300,400, redStrokePaint);
}
}
总结
经过这两个平台的绘图, 相信你已经有了一定的思路了.
我在这里列一个表格, 对比下这两个平台:
类型 | Android | J2ME |
---|---|---|
程序提供的入口 | Activity | MIDlet |
设置我们界面的方法 | setContentView() | Display.getDisplay().setCurrent() |
提供界面刷新的类 | View | Canvas |
绘图的场所(方法) | onDraw()View的方法
|
paint()Canvas的方法
|
所谓的画笔(提供绘图功能的类) | Canvas由onDraw传递
|
Graphics由paint传递
|
从这个表格就可以看出, 什么是套路. 在一篇文章里, 我们将会讲一讲H5的绘图
碎碎念
在这片文章里, 我特意加了一些引导你去思考的地方. 如果是你碰到一个新平台, 要使用之前的套路, 知识去摸索, 去官网上搜索. 因为,当有新的平台, 游戏框架出来的时候, 你只能求助于官网.
上面给出的那些超链接, 都建议点进去看一下. 全都是官方的API. 你可以得到宝贵的知识和技巧
比如, 如果你顺着这些超链接一个个看过去, 可以看到关于Activity完整的描述, 启动,暂定,重启
特别是在看到onDraw(Canvas)的时候, 你点过去看下关于Canvas的描述, 会发现一个小惊喜
这个小惊喜, 在后面的文章里会讲到. 在这个小惊喜里也可以看出, 当你碰到一个新的框架,新平台时, 官方已经为了准备了更好的方案
he android.graphics
framework divides drawing into two areas:
What to draw, handled by Canvas
How to draw, handled by Paint
.
For instance, Canvas
provides a method to draw a line, while Paint
provides methods to define that line's color. Canvas
has a method to draw a rectangle, while Paint
defines whether to fill that rectangle with a color or leave it empty. Simply put, Canvas
defines shapes that you can draw on the screen, while Paint
defines the color, style, font, and so forth of each shape you draw.