Android 在SurfaceView画布上平铺位图
我无法平铺Android 在SurfaceView画布上平铺位图,android,bitmap,android-canvas,surfaceview,tile,Android,Bitmap,Android Canvas,Surfaceview,Tile,我无法平铺位图。我想将位图绘制到二维数组中定义的坐标 我想能够画出,比如说,草,到特定坐标,水,等等,到其他坐标 我花了好几天的时间试图弄明白这一点,如果有任何见解,我将不胜感激。我只能让画布绘制1个“草”位图,因此我觉得我的for循环中有一个错误。我看了很多其他的瓷砖,不希望每一块瓷砖都是一样的。这是我的密码: MapLoader.java public class MapLoader extends SurfaceView implements SurfaceHolder.Callback,
位图
。我想将位图
绘制到二维数组
中定义的坐标
我想能够画出,比如说,草,到特定坐标,水,等等,到其他坐标
我花了好几天的时间试图弄明白这一点,如果有任何见解,我将不胜感激。我只能让画布
绘制1个“草”位图
,因此我觉得我的for循环中有一个错误。我看了很多其他的瓷砖,不希望每一块瓷砖都是一样的。这是我的密码:
MapLoader.java
public class MapLoader extends SurfaceView implements SurfaceHolder.Callback,
Runnable {
SurfaceHolder holder;
Thread thread;
Bitmap grass = BitmapFactory.decodeResource(getResources(),
R.drawable.grass);
boolean running = false;
int[][] grassCoords = new int[][] { { 0, 16, 32, 48, 64 },
{ 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 },
{ 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 } };
public MapLoader(Context context) {
super(context);
holder = getHolder();
holder.addCallback(this);
}
public MapLoader(Context context, AttributeSet attrs) {
super(context, attrs);
holder = getHolder();
holder.addCallback(this);
}
public MapLoader(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
holder = getHolder();
holder.addCallback(this);
}
public void pause() {
running = false;
while (running) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
thread = null;
}
public void resume() {
running = true;
thread = new Thread(this);
thread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
running = true;
thread = new Thread(this);
thread.start();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = holder.lockCanvas();
draw(c);
holder.unlockCanvasAndPost(c);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public void run() {
while (running == true) {
// performs drawing to the canvas
if (!holder.getSurface().isValid()) {
continue;
}
Canvas c = holder.lockCanvas();
int x = 0;
int y = 0;
for (x = 0; x < grassCoords.length; x += grass.getWidth()) {
for (y = 0; y < grassCoords.length; y += grass.getHeight()) {
c.drawBitmap(grass, x, y, null);
}
}
holder.unlockCanvasAndPost(c);
}
}
}
public class Test extends Activity {
MapLoader mapLoader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mapLoader = new MapLoader(this);
setContentView(mapLoader);
}
}
任何帮助或建议(即使是有效方法的链接)都将不胜感激
谢谢
马特很难理解你想做什么 如何将坐标编码到
grassCoords
数组中?作为其当前形式,它具有5x5
元素
int[][] grassCoords = new int[][] { { 0, 16, 32, 48, 64 },
{ 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 },
{ 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 } };
因为它的名字中有grass
,我假设你只想画grass,那么你可以这样定义它
int[][] grassCoords = new int[][] { {0, 0}, {16, 16}, {32, 32} };
在像{0,0}
这样的每个元素上面,都是草瓷砖的一个坐标
第二个问题是在循环中,除了数组长度外,您不从grassCoords
读取任何数据,当您增加索引时,您会使用grass.getWidth()
来增加它,这实际上没有意义
int x = 0;
int y = 0;
for (x = 0; x < grassCoords.length; x += grass.getWidth()) {
for (y = 0; y < grassCoords.length; y += grass.getHeight()) {
c.drawBitmap(grass, x, y, null);
}
}
intx=0;
int y=0;
对于(x=0;x
您应该正确地迭代数组并从中获取数据
int x = 0;
for (x = 0; x < grassCoords.length; x++) {
c.drawBitmap(grass, grassCoords[x][0], grassCoords[x][1], null);
}
intx=0;
对于(x=0;x
如果我是你,我会至少研究一次相关部分
for (x = 0; x < grassCoords.length; x += grass.getWidth()) {
for (y = 0; y < grassCoords.length; y += grass.getHeight()) {
c.drawBitmap(grass, x, y, null);
}
}
请记住,如果您只想以固定的间隔填充平铺,则无需定义坐标。它们都是倍数,所以定义一个坐标数组没有多大意义。只需考虑每个瓷砖点作为一个网格点,并乘以瓦片的高度/宽度。谢谢链接和解释。起初我很难理解2d数组。这两个答案都很有帮助,教会了我很多东西。谢谢您和@Geobits!
for(int x = startX; x < endX; x += grass.getWidth()){
for(int y = startY; y < endY; y += grass.getHeight()){
c.drawBitmap(grass, x, y, null);
}
}