分享

Android拼图游戏开发全纪录4

 水与火604 2016-03-13

今天我们主要实现我们的主界面:国际惯例:


界面我们已经在第一天做好了,今天我们就要实现这个界面的功能,

分析一下,这个界面包含以下几个功能:

1、显示游戏的难度:使用popupwindow,选择后改变显示的数字

2、显示默认的待拼图图片,包含一张选择自定义的图片:这个比较简单,只是GridView的最简单应用而已

3、自定义按钮功能:调用系统图册和相机

4、查看记录和了解更多:这个也是一般的应用需求,比较简单

  1. package com.xys.xpuzzle.activity;  
  2.   
  3. import java.io.File;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import android.app.Activity;  
  7. import android.app.AlertDialog;  
  8. import android.content.DialogInterface;  
  9. import android.content.Intent;  
  10. import android.database.Cursor;  
  11. import android.graphics.Bitmap;  
  12. import android.graphics.BitmapFactory;  
  13. import android.graphics.Color;  
  14. import android.graphics.drawable.ColorDrawable;  
  15. import android.graphics.drawable.Drawable;  
  16. import android.net.Uri;  
  17. import android.os.Bundle;  
  18. import android.os.Environment;  
  19. import android.provider.MediaStore;  
  20. import android.view.Gravity;  
  21. import android.view.LayoutInflater;  
  22. import android.view.View;  
  23. import android.view.View.OnClickListener;  
  24. import android.widget.AdapterView;  
  25. import android.widget.AdapterView.OnItemClickListener;  
  26. import android.widget.GridView;  
  27. import android.widget.PopupWindow;  
  28. import android.widget.TextView;  
  29. import com.xys.xpuzzle.R;  
  30. import com.xys.xpuzzle.adapter.GridPicListAdapter;  
  31.   
  32. /** 
  33.  * 程序主界面:显示默认图片列表、自选图片按钮 
  34.  *  
  35.  * @author xys 
  36.  *  
  37.  */  
  38. public class MainActivity extends Activity implements OnClickListener {  
  39.   
  40.     // 返回码:系统图库  
  41.     private static final int RESULT_IMAGE = 100;  
  42.     // 返回码:相机  
  43.     private static final int RESULT_CAMERA = 200;  
  44.     // Temp照片路径  
  45.     public static String TEMP_IMAGE_PATH;  
  46.     // IMAGE TYPE  
  47.     private static final String IMAGE_TYPE = "image/*";  
  48.     // GridView 显示图片  
  49.     private GridView gv_Pic_List;  
  50.     private List<Bitmap> picList;  
  51.     // 主页图片资源ID  
  52.     private int[] resPicId;  
  53.     // 显示Type  
  54.     private TextView tv_puzzle_main_type_selected;  
  55.     private LayoutInflater layoutInflater;  
  56.     private PopupWindow popupWindow;  
  57.     private View popupView;  
  58.     private TextView tvType2;  
  59.     private TextView tvType3;  
  60.     private TextView tvType4;  
  61.     // 游戏类型N*N  
  62.     private int type = 2;  
  63.     // 本地图册、相机选择  
  64.     private String[] customItems = new String[] { "本地图册", "相机拍照" };  
  65.   
  66.     @Override  
  67.     protected void onCreate(Bundle savedInstanceState) {  
  68.     super.onCreate(savedInstanceState);  
  69.     setContentView(R.layout.xpuzzle_main);  
  70.   
  71.     TEMP_IMAGE_PATH = Environment.getExternalStorageDirectory().getPath() + "/ttt.jpg";  
  72.     picList = new ArrayList<Bitmap>();  
  73.     // 初始化Views  
  74.     initViews();  
  75.     // 数据适配器  
  76.     gv_Pic_List.setAdapter(new GridPicListAdapter(MainActivity.this, picList));  
  77.     // Item点击监听  
  78.     gv_Pic_List.setOnItemClickListener(new OnItemClickListener() {  
  79.   
  80.         @Override  
  81.         public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {  
  82.         if (position == resPicId.length - 1) {  
  83.             // 选择本地图库 相机  
  84.             showDialogCustom();  
  85.         } else {  
  86.             // 选择默认图片  
  87.             Intent intent = new Intent(MainActivity.this, PuzzleMain.class);  
  88.             intent.putExtra("picSelectedID", resPicId[position]);  
  89.             intent.putExtra("type", type);  
  90.             startActivity(intent);  
  91.         }  
  92.         }  
  93.     });  
  94.   
  95.     /**  
  96.      * 显示难度Type  
  97.      */  
  98.     tv_puzzle_main_type_selected.setOnClickListener(new OnClickListener() {  
  99.   
  100.         @Override  
  101.         public void onClick(View v) {  
  102.         // 弹出popup window  
  103.         popupShow(v);  
  104.         }  
  105.     });  
  106.     }  
  107.   
  108.     // 显示选择系统图库 相机对话框  
  109.     private void showDialogCustom() {  
  110.     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);  
  111.     builder.setTitle("选择:");  
  112.     builder.setItems(customItems, new DialogInterface.OnClickListener() {  
  113.   
  114.         @Override  
  115.         public void onClick(DialogInterface dialog, int which) {  
  116.         if (0 == which) {  
  117.             // 本地相册  
  118.             Intent intent = new Intent(Intent.ACTION_PICK, null);  
  119.             intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_TYPE);  
  120.             startActivityForResult(intent, RESULT_IMAGE);  
  121.         } else if (1 == which) {  
  122.             // 系统相机  
  123.             Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  124.             Uri photoUri = Uri.fromFile(new File(TEMP_IMAGE_PATH));  
  125.             intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);  
  126.             startActivityForResult(intent, RESULT_CAMERA);  
  127.         }  
  128.         }  
  129.     });  
  130.     builder.create().show();  
  131.     }  
  132.   
  133.     /** 
  134.      * 调用图库相机回调方法 
  135.      */  
  136.     @Override  
  137.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  138.     super.onActivityResult(requestCode, resultCode, data);  
  139.     if (resultCode == RESULT_OK) {  
  140.         if (requestCode == RESULT_IMAGE && data != null) {  
  141.         // 相册  
  142.         Cursor cursor = this.getContentResolver().query(data.getData(), null, null, null, null);  
  143.         cursor.moveToFirst();  
  144.         String imagePath = cursor.getString(cursor.getColumnIndex("_data"));  
  145.         Intent intent = new Intent(MainActivity.this, PuzzleMain.class);  
  146.         intent.putExtra("picPath", imagePath);  
  147.         intent.putExtra("type", type);  
  148.         startActivity(intent);  
  149.         } else if (requestCode == RESULT_CAMERA) {  
  150.         // 相机  
  151.         Intent intent = new Intent(MainActivity.this, PuzzleMain.class);  
  152.         intent.putExtra("picPath", TEMP_IMAGE_PATH);  
  153.         intent.putExtra("type", type);  
  154.         startActivity(intent);  
  155.         }  
  156.     }  
  157.     }  
  158.   
  159.     /** 
  160.      * 显示popup window 
  161.      *  
  162.      * @param view 
  163.      */  
  164.     private void popupShow(View view) {  
  165.     // 显示popup window  
  166.     popupWindow = new PopupWindow(popupView, 200, 50);  
  167.     popupWindow.setFocusable(true);  
  168.     popupWindow.setOutsideTouchable(true);  
  169.     // 透明背景  
  170.     Drawable transpent = new ColorDrawable(Color.TRANSPARENT);  
  171.     popupWindow.setBackgroundDrawable(transpent);  
  172.     // 获取位置  
  173.     int[] location = new int[2];  
  174.     view.getLocationOnScreen(location);  
  175.     popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, location[0] - 40, location[1] + 50);  
  176.     }  
  177.   
  178.     /** 
  179.      * 初始化Views 
  180.      */  
  181.     private void initViews() {  
  182.     gv_Pic_List = (GridView) findViewById(R.id.gv_xpuzzle_main_pic_list);  
  183.     // 初始化Bitmap数据  
  184.     resPicId = new int[] { R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4, R.drawable.pic5, R.drawable.pic6, R.drawable.pic7,  
  185.         R.drawable.pic8, R.drawable.pic9, R.drawable.pic10, R.drawable.pic11, R.drawable.pic12, R.drawable.pic13, R.drawable.pic14,  
  186.         R.drawable.pic15, R.drawable.plus };  
  187.     Bitmap[] bitmaps = new Bitmap[resPicId.length];  
  188.     for (int i = 0; i < bitmaps.length; i++) {  
  189.         bitmaps[i] = BitmapFactory.decodeResource(getResources(), resPicId[i]);  
  190.         picList.add(bitmaps[i]);  
  191.     }  
  192.     // 显示type  
  193.     tv_puzzle_main_type_selected = (TextView) findViewById(R.id.tv_puzzle_main_type_selected);  
  194.     layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);  
  195.     // type view  
  196.     popupView = layoutInflater.inflate(R.layout.xpuzzle_main_type_selected, null);  
  197.     tvType2 = (TextView) popupView.findViewById(R.id.tv_main_type_2);  
  198.     tvType3 = (TextView) popupView.findViewById(R.id.tv_main_type_3);  
  199.     tvType4 = (TextView) popupView.findViewById(R.id.tv_main_type_4);  
  200.   
  201.     // 监听事件  
  202.     tvType2.setOnClickListener(this);  
  203.     tvType3.setOnClickListener(this);  
  204.     tvType4.setOnClickListener(this);  
  205.     }  
  206.   
  207.     /** 
  208.      * popup window item点击事件 
  209.      */  
  210.     @Override  
  211.     public void onClick(View v) {  
  212.     switch (v.getId()) {  
  213.     // Type  
  214.     case R.id.tv_main_type_2:  
  215.         type = 2;  
  216.         tv_puzzle_main_type_selected.setText("2 X 2");  
  217.         break;  
  218.     case R.id.tv_main_type_3:  
  219.         type = 3;  
  220.         tv_puzzle_main_type_selected.setText("3 X 3");  
  221.         break;  
  222.     case R.id.tv_main_type_4:  
  223.         type = 4;  
  224.         tv_puzzle_main_type_selected.setText("4 X 4");  
  225.         break;  
  226.     default:  
  227.         break;  
  228.     }  
  229.     popupWindow.dismiss();  
  230.     }  
  231. }  

注释还是比较清晰的,相信大家都看得懂。

下面还有送一个数据适配器:

  1. package com.xys.xpuzzle.adapter;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.R.color;  
  6. import android.content.Context;  
  7. import android.graphics.Bitmap;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.BaseAdapter;  
  11. import android.widget.GridView;  
  12. import android.widget.ImageView;  
  13.   
  14. /** 
  15.  * 程序主界面数据适配器 
  16.  *  
  17.  * @author xys 
  18.  *  
  19.  */  
  20. public class GridPicListAdapter extends BaseAdapter {  
  21.   
  22.     // 映射List  
  23.     private List<Bitmap> picList;  
  24.     private Context context;  
  25.   
  26.     public GridPicListAdapter(Context context, List<Bitmap> picList) {  
  27.     this.context = context;  
  28.     this.picList = picList;  
  29.     }  
  30.   
  31.     @Override  
  32.     public int getCount() {  
  33.     return picList.size();  
  34.     }  
  35.   
  36.     @Override  
  37.     public Object getItem(int position) {  
  38.     return picList.get(position);  
  39.     }  
  40.   
  41.     @Override  
  42.     public long getItemId(int position) {  
  43.     return position;  
  44.     }  
  45.   
  46.     @Override  
  47.     public View getView(int position, View convertView, ViewGroup arg2) {  
  48.     ImageView iv_pic_item = null;  
  49.     if (convertView == null) {  
  50.         iv_pic_item = new ImageView(context);  
  51.         // 设置布局 图片  
  52.         iv_pic_item.setLayoutParams(new GridView.LayoutParams(80, 100));  
  53.         // 设置显示比例类型  
  54.         iv_pic_item.setScaleType(ImageView.ScaleType.FIT_XY);  
  55.     } else {  
  56.         iv_pic_item = (ImageView) convertView;  
  57.     }  
  58.     iv_pic_item.setBackgroundColor(color.black);  
  59.     iv_pic_item.setImageBitmap(picList.get(position));  
  60.     return iv_pic_item;  
  61.     }  
  62. }  

今天的难点在于调用系统图册和相机:

1、调用的Intent在代码中已经写清楚了

2、调用相机的时候,如果直接返回data,其实是返回的相机缩略图,如果要获得原始图片,就需要先保存在SD卡上,再去获取这张图片,希望大家注意。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多