求帮忙解释一下android的拼图游戏代码
程序代码:
package org.android.picture_demo; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.DialogInterface.OnClickListener; import android.content.SharedPreferences.Editor; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.ImageView.ScaleType; import android.widget.RadioGroup.OnCheckedChangeListener; public class PictureDemo extends Activity { @SuppressWarnings("unused") private static final String TAG = PictureDemo.class.getName(); private int levalNow = 3; private ImageView mImages[][];// 存放小图片的数组 private Bitmap mBitmap;// 资源图片 private int mImageWidth, mImageHeight;// slot的宽高 private int mImageNum[];// 图片的顺序 private int x, y;// 图片裁剪的起始位置 private int clickNum = 0;// 点击参数 // 资源图片群 private int image[] = new int[] { R.drawable.aa13, R.drawable.iamge, R.drawable.naruto_ying_chutian, R.drawable.zaibuzhan_bai, R.drawable.you2, R.drawable.woailuo2, R.drawable.you3, }; Editor edit; // 屏幕的参数 private int windowWidth; private int windowHeight; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); edit = this.getSharedPreferences("LEVAL", Context.MODE_WORLD_WRITEABLE) .edit(); levalNow = this.getSharedPreferences("LEVAL", Context.MODE_WORLD_WRITEABLE).getInt("MYLEVAL", MainActivity.LEVAL1); // Log.e(TAG, "" + levalNow); WindowManager w = this.getWindowManager(); windowHeight = w.getDefaultDisplay().getHeight(); windowWidth = w.getDefaultDisplay().getWidth(); setBitmap(); setImage(); } public void setImage() { mImageWidth = mBitmap.getWidth() / levalNow; mImageHeight = mBitmap.getHeight() / levalNow; mImageNum = new int[levalNow * levalNow]; erraLen(levalNow * levalNow); readyImage(); setLayout(); } private void setLayout() { PictureLayout lay = new PictureLayout(this, mImages); lay.setGravity(Gravity.CENTER); setContentView(lay); } private void setBitmap() { // 计算选择的是第几张图片 int postion = (int) Math.floor(Math.random() * image.length); // 从资源文件中读取图片 mBitmap = readBitmap(getResources(), image[postion]); } /** * @see 把一个有序数组通过随机取数打乱 * @param a */ public void erraLen(int a) { int errInt[] = new int[a]; for (int i = 0; i < a; i++) { errInt[i] = i; } int len = a;// 设置随机数的范围 for (int i = 0; i < a; i++) { int index = (int) Math.floor((Math.random() * len)); mImageNum[i] = errInt[index]; for (int j = index; j < errInt.length - 1; j++) { // 把选中的数之后的数一次向前移一位 errInt[j] = errInt[j + 1]; } len--;// 随机数的范围减一 } } /** * @see 准备图片 把一张图片截成几张小的通过打乱的数组来取cache里的图片放到View里面就成打乱二维数组 */ private void readyImage() { Matrix matrix = new Matrix(); mImages = new ImageView[levalNow][levalNow]; // 设置缩放比例 float scaleW = ((float) mBitmap.getWidth()) / windowWidth; float scaleH = ((float) mBitmap.getHeight()) / windowHeight; float scale = scaleW > scaleH ? 1 / scaleW : 1 / scaleH; matrix.postScale(scale, scale); Bitmap bitss[][] = new Bitmap[levalNow][levalNow]; ImageView[][] cache = new ImageView[levalNow][levalNow]; int cont = 1; for (int i = 0; i < levalNow; i++) { for (int j = 0; j < levalNow; j++) { int x = i * mImageWidth; int y = j * mImageHeight; // 第一个是要在那个图片上截取 x,y是要在这个图的那个位置截取 // blockWidth,blockHeight是截取的长和宽matrix是缩放的比例 //源代码 /*Bitmap mapi = Bitmap.createBitmap(mBitmap, x, y, mImageWidth, mImageHeight, matrix, true);*/ //修改的 Bitmap mapi = Bitmap.createBitmap(mBitmap, x, y, mImageWidth, mImageHeight, matrix, true); bitss[i][j] = mapi; ImageView img = new ImageView(this); BitmapDrawable draw = new BitmapDrawable(bitss[i][j]); img.setImageDrawable(draw); img.setId(cont); img.setScaleType(ScaleType.FIT_XY); img.setOnClickListener(OnClickImageView1); cache[i][j] = img; cont++; } } for (int i = 0; i < mImageNum.length; i++) { int x = mImageNum[i] / levalNow; int y = mImageNum[i] % levalNow; int x1 = i / levalNow; int y1 = i % levalNow; mImages[x1][y1] = cache[x][y]; } } private android.view.View.OnClickListener OnClickImageView1 = new ImageView.OnClickListener() { @Override public void onClick(View v) { if (clickNum == 0) {// 即需要交换的第一个图片 for (int i = 0; i < mImages.length; i++) { boolean f = false; for (int j = 0; j < mImages[i].length; j++) { ImageView imgg = mImages[i][j]; if (imgg == v) { x = i; y = j; clickNum++; f = true; break; } } if (f) { break; } } } else {// 即需要交换的第二个图片 for (int i = 0; i < mImages.length; i++) { for (int j = 0; j < mImages[i].length; j++) { ImageView imgg = mImages[i][j]; if (imgg == v) { if (clickNum == 1) { changePosition(i, j, x, y); x = 0; y = 0; clickNum = 0; } } } } } } }; private void changePosition(int x1, int y1, int x2, int y2) { // 判断宽和高差的绝对值是否是1如果是1交换不是提示用户 if (Math.abs(x1 - x2) + Math.abs(y1 - y2) != 1) { Builder bul = new AlertDialog.Builder(this); bul.setTitle(R.string.dialog); bul.setMessage(R.string.cannot_change); bul.setPositiveButton(R.string.yes, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).show(); } else { String str = ""; ImageView bitF = null; bitF = mImages[x1][y1]; mImages[x1][y1] = mImages[x2][y2]; mImages[x2][y2] = bitF; for (int i = 0; i < mImages.length; i++) { for (int j = 0; j < mImages[i].length; j++) { ImageView img = mImages[i][j]; // 得到imageview的父控件 LinearLayout pa = (LinearLayout) img.getParent(); // 在移除imageview使其父控件没有 pa.removeView(img); } } setLayout(); for (int i = 0; i < mImages.length; i++) { for (int j = 0; j < mImages[i].length; j++) { str += mImages[i][j].getId(); } } switch (levalNow) { case 2: if (str.equals("1324")) { this.success(); } break; case 3: if (str.equals("147258369")) { this.success(); } break; case 4: if (str.equals("15913261014371115481216")) { this.success(); } break; case 5: if (str.equals("16111621271217223813182349141924510152025")) { this.success(); } break; } } } public void success() { Builder bul = new AlertDialog.Builder(this); bul.setTitle(R.string.dialog); bul.setMessage(R.string.congratulation); bul.setPositiveButton(R.string.restart, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(PictureDemo.this, PictureDemo.class); PictureDemo.this.startActivity(intent); finish(); } }); bul.setNegativeButton(R.string.quit, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); bul.show(); } RadioButton r; @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.change_leval: changeLeval(); break; case R.id.rechoose: setBitmap(); setImage(); break; case R.id.quit: PictureDemo.this.finish(); break; } return super.onOptionsItemSelected(item); } public void changeLeval() { AlertDialog.Builder build = new Builder(PictureDemo.this); build.setTitle(R.string.leval); LayoutInflater inflater = LayoutInflater.from(PictureDemo.this); final RadioGroup view = (RadioGroup) inflater.inflate( R.layout.leval_dialog, null); view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { r = (RadioButton) view.findViewById(checkedId); switch (checkedId) { case R.id.leval1: r.setChecked(true); levalNow = 3; break; case R.id.leval2: r.setChecked(true); levalNow = 4; break; case R.id.leval3: levalNow = 5; r.setChecked(true); break; } } }); switch (levalNow) { case 3: r = (RadioButton) view.findViewById(R.id.leval1); r.setChecked(true); break; case 4: r = (RadioButton) view.findViewById(R.id.leval2); r.setChecked(true); break; case 5: r = (RadioButton) view.findViewById(R.id.leval3); r.setChecked(true); break; } build.setNeutralButton(R.string.yes, new OnClickListener() { public void onClick(DialogInterface dialog, int which) { setImage(); edit.putInt("LEVAL", levalNow); (); } }); build.setNegativeButton(R.string.cancel, null); build.setView(view); build.show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // 加载menu getMenuInflater().inflate(R.menu.my_menu, menu); return true; } /** * @see 获取资源文件中的图片,节省内存的方法 * @param r * @param resId * @return */ public static Bitmap readBitmap(Resources r, int resId) { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; // 获取资源图片 /* InputStream is = r.openRawResource(resId); return BitmapFactory.decodeStream(is, null, opt);*/ //获取内部图片 return BitmapFactory.decodeFile("/sdcard/camera1.jpg", opt); //获取照相机拍照的照片 } }也可以加我的QQ:624800258,我贴出来的是游戏的主要代码