我正在开发类似于最着名的文字游戏。 该板有15 x 15块瓷砖。瓷砖有5种颜色可供选择。
董事会可以放大.I.e。您可以拥有完整的电路板视图,也可以放大2倍。
我已经在我的Activity中实现了两种绘制棋盘的方法。两者都在我的Galaxy S和各种仿真器上测试过。两者似乎都适用于绝大多数设备。 但,它们都会导致少数用户遇到问题(这是我在这里要解决的问题)。
以下是2种设计的描述:
说明
这是最简单的一个。该板是一个独特的ImageView
(子类用于处理双击缩放和拖动)。
图像PNG资源是高分辨率:约。两倍于最大屏幕尺寸的尺寸,以避免在放大时进行放大。
的问题: OutOfMemory问题似乎有时出现在大屏幕上,特别是在10“华硕TF101平板电脑上。
注释: 对TF101的测试表明,RAM使用率比Galaxy S高3倍。考虑到必须绘制的巨大缩放位图,这似乎是合乎逻辑的。
说明 我试图减少位图使用的RAM,并利用板子只是重复5种小方块的事实。 为了简化电路板视图的大小调整,我选择使其成为一个自定义的LinearLayout,包含15个嵌套的LinearLayout,每个包含15个图像(当然不是性能最佳的选项)。
这是我的XML布局对于4 x 4电路板的样子:
<MyCustomLinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1" >
</ImageView>
<ImageView
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1" >
</ImageView>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1" >
</ImageView>
<ImageView
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1" >
</ImageView>
</LinearLayout>
</MyCustomLinearLayout>
的问题: 一些用户的一些崩溃或视觉故障。 (我仍然没有太多关于这个的信息)
注释: 该选项的优点:是内存占用优化:5个小位图中每个位图只有一个实例保存在内存中。调整电路板大小非常简单:当我调整MyCustomLinearLayout大小时,Android会调整位图和嵌套LinearLayout的所有大小。
缺点:视图太多,每次缩放时系统必须重新计算哪些尺寸。
我如何改进选项2以保持较低的RAM占用空间,同时尊重其他性能良好做法(例如没有数百个视图)?
而不是SurfaceView
,我选择了一个简单的自定义View
。
我担心在onDraw()
方法中进行大量的位图绘制会导致电路板的拖动变得滞后(因为移动电路板时会不断调用onDraw()
)。
事实证明它非常流畅(甚至可能比选项2更平滑)。 至于RAM的使用,它比选项2(使用Eclipse Memory Analyzer进行比较)稍微重一点,所以它是令人满意的。我仍然有一些关于OutOfMemory错误的报告(“位图超出最大VM堆大小”),但我认为当使用位图时这是不可避免的。
这是最重要的代码,我在其中绘制15x15位图(从视图的构造函数中的资源初始化)来构建游戏板:
public void drawTileAtCoordsOnCanvas(Bitmap bm, Canvas canvas, int x, int y) {
_rect.set(x * _sizeOfTile, y * _sizeOfTile, (x + 1) * _sizeOfTile, (y + 1) * _sizeOfTile);
canvas.drawBitmap(bm, null, _rect, _paint);
}
public void onDraw(Canvas canvas) {
for (int i = 0; i < _rules.BOARD_SIZE; i++) {
for (int j = 0; j < _rules.BOARD_SIZE; j++) {
switch (_rules._boardOfMultiplicators.get(i).get(j)) {
case NL:
drawTileAtCoordsOnCanvas(_bitmapNormalTile, canvas, i, j);
break;
case DL:
drawTileAtCoordsOnCanvas(_bitmapDlTile, canvas, i, j);
break;
case TL:
drawTileAtCoordsOnCanvas(_bitmapTlTile, canvas, i, j);
break;
case DW:
drawTileAtCoordsOnCanvas(_bitmapDwTile, canvas, i, j);
break;
case TW:
drawTileAtCoordsOnCanvas(_bitmapTwTile, canvas, i, j);
break;
}
}
}
drawTileAtCoordsOnCanvas(_bitmapStarTile, canvas, 7, 7);
}
答案 0 :(得分:2)
您的第二个选项是最好的(重复5个图像),但不是使用ImageViews,直接在自定义视图上绘制会更有效。性能会明显提高。
SurfaceView
可能是最佳选择。
答案 1 :(得分:0)
我根本没有Android开发经验,所以请稍等一下,但只是基于查看相关问题和一些谷歌搜索,在我看来GridView
可能是你的意思想。