【广而告之】山寨腾讯“爱消除”游戏已经正式入驻GitHub,项目地址是:https://github.com/3125788/CrazyLink
欢迎广大寨友一起来完善这个游戏。
在山寨腾讯“爱消除”游戏7日教程中,我们留下了一个问题让广大寨友去思考:如何自适应屏幕适配?今天我们将要揭晓这个答案。
大家一定为适配ANDROID各种各样的屏幕吃尽了苦头,通用的做法是为不同的屏幕创建不同的资源文件及布局文件。可想而知,这会是多么大的一个工作量。
今天我们这里介绍的方法,利用了OpenGL ES天然的特性,只需要一套资源文件及布局文件,就可以完成对所有不同尺寸屏幕的适配。听起来是不是很COOL?
好吧,下面我们进入正题。
我们知道,ANDROID支持各种各样的屏幕类型及分辨率。如WVGA800、WVGA854、QVGA、HVGA、WQVGA400、WQVGA432,Denisty 有LOW、HIGH、MIDIUM等。
面对如此多的屏幕,首先要做的一件事情,就是选择一种主流的屏幕,在这种屏幕的基础上进行开发测试,今天我们选择的是WVGA800。其详细的参数如下图:
对应的设置代码如下:
public static int VIEW_WIDTH = 480;
public static int VIEW_HEIGHT = 800;
public static int ADP_SIZE = 0;
以上三行代码在CrazyLinkConstent.java中能找到定义。这个定义约束了我们的设计是基于480*800这个分辨率的,不同的分辨率会根据ADP_SIZE计算出的值进行自动的变换。
关注下面这个函数:
public void onSurfaceChanged(GL10 gl, int width, int height) {
CrazyLinkConstent.translateRatio = (float) width / height;
CrazyLinkConstent.screentRatio = (float) width / height;
CrazyLinkConstent.ADP_SIZE = CrazyLinkConstent.UNIT_SIZE * CrazyLinkConstent.VIEW_HEIGHT/height * width/CrazyLinkConstent.VIEW_WIDTH;
screenTouch = new ScreenTouch(mContext, width, height);
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(-CrazyLinkConstent.screentRatio*CrazyLinkConstent.GRID_NUM/2,
CrazyLinkConstent.screentRatio*CrazyLinkConstent.GRID_NUM/2,
-1*CrazyLinkConstent.GRID_NUM/2,
1*CrazyLinkConstent.GRID_NUM/2, 10, 100);
}
计算方法如下:
CrazyLinkConstent.ADP_SIZE = CrazyLinkConstent.UNIT_SIZE * CrazyLinkConstent.VIEW_HEIGHT/height * width/CrazyLinkConstent.VIEW_WIDTH;
WVGA的适配效果如下:
接下来看看HVGA的参数及效果:
QVGA的参数及效果:
WVGA854的参数及效果:
WQVGA432的参数及效果:
WQVGA400的参数及效果:
大家注意到:除了QVGA确实因为屏幕过小,有部分信息不能显示完整外,其余各种屏幕都适配的很好!
因此,为了达到好的适配效果,同时又能最大限度降低适配的工作量,选择一种主流的分辨率进行精心适配至关重要。选择不当,可能会使在不同分辨率下的效果差异很大。
喜欢这篇文章,就请你顶一下。
完整的源代码下载,请访问山寨腾讯”爱消除“游戏项目,地址是:https://github.com/3125788/CrazyLink
这个项目欢迎大家提交自己的修改。