為什么空指針?
//分別獲取空方塊的位置與點擊方塊的位置,通過x,y兩邊都差1的方式
GameData mNullGameData = (GameData) iv_null_ImageView.getTag();這里空指針?
GameData mGameData = (GameData) mImageView.getTag();
package com.example.puzzlegame;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
/**利用二維數組創建若干游戲小方塊*/
private ImageView[][] iv_game_arr = new ImageView[4][4];
/** 游戲主界面 ?*/
private GridLayout gl_main_game;
//當前空方塊的實例的保存
private ImageView iv_null_ImageView;
@Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ??
? ? ? ? //初始化游戲的若干個小方塊
? ? ? ? Bitmap bigBm = ((BitmapDrawable)getResources().getDrawable(R.drawable.g4)).getBitmap();//獲取一張大圖
? ? ? ? int tuWandH = bigBm.getWidth()/4;//每個游戲小方塊的寬和高
? ? ? ??
? ? ? ? for (int i = 0; i < iv_game_arr.length; i++) {
for (int j = 0; j < iv_game_arr[0].length; j++) {
Bitmap bm = Bitmap.createBitmap(bigBm, j * tuWandH, i * tuWandH, tuWandH, tuWandH);//根據行和列來切成若干個游戲小圖片
iv_game_arr[i][j] = new ImageView(this);
//設置每一個游戲小方塊的圖案
iv_game_arr[i][j].setImageBitmap(bm);
//設置方塊之間的間距
iv_game_arr[i][j].setPadding(1, 1, 1, 1);
iv_game_arr[i][j].setTag(new GameData(i, j, bm));//綁定自定義的數據
iv_game_arr[i][j].setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
boolean flag = isHasByNullImageView((ImageView) v);
Toast.makeText(MainActivity.this, "位置是否存在:"+flag, Toast.LENGTH_SHORT).show();
}
});
}
}
? ? ? ??
? ? ? ? //初始化游戲主界面,并添加若干個小方塊
? ? ? ? gl_main_game = (GridLayout) findViewById(R.id.gl_main_game);
? ? ? ? for (int i = 0; i < iv_game_arr.length; i++) {
for (int j = 0; j < iv_game_arr[0].length; j++) {
gl_main_game.addView(iv_game_arr[i][j]);
}
}
? ? ? ? //設置最后一個方塊為空的
? ? ? ? setNullImageView(iv_game_arr[3][3]);
? ? }
//設置某個方塊為空方塊
public void setNullImageView(ImageView mImageView){
mImageView.setImageBitmap(null);
}
//判斷當前點擊的方塊,是否與空方塊的位置關系是相鄰關系s
public boolean isHasByNullImageView(ImageView mImageView){
//分別獲取空方塊的位置與點擊方塊的位置,通過x,y兩邊都差1的方式
GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
GameData mGameData = (GameData) mImageView.getTag();
if (mNullGameData.y==mGameData.y && mGameData.x+1==mNullGameData.x) { //當前點擊的方塊在空方塊的上邊
return true;
}else if(mNullGameData.y==mGameData.y && mGameData.x-1==mNullGameData.x){//當前點擊的方塊在空方塊的下邊
return true;
}else if(mNullGameData.y==mGameData.y+1 && mGameData.x==mNullGameData.x){//當前點擊的方塊在空方塊的左邊
return true;
}else if(mNullGameData.y==mGameData.y-1 && mGameData.x==mNullGameData.x){//當前點擊的方塊在空方塊的右邊
return true;
}
return false;
}
//每個游戲小方塊上要綁定的數據
class GameData{
//每個小方塊的實際位置
public int x = 0;
//每個小方塊的實際位置
public int y = 0;
//每個小方塊的圖片
public Bitmap bm;
//每個小方塊的圖片的位置
public int p_x = 0;
//每個小方塊的圖片的位置
public int p_y = 0;
public GameData(int x, int y, Bitmap bm){
this.x = x;
this.y = y;
this.bm = bm;
this.p_x = x;
this.p_y = y;
}
}
}
2016-08-03
在setNullImageView中加一句話 ?iv_null_ImageView = mImageView ;