本文主要是介绍从拼图游戏开始(八)_功能完善,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
好几天没写博客了,今天继续扯拼图游戏。话说上次(从拼图游戏开始(七)_数据模块框架实现)实现了问题数据的持久化,任意长宽比图片的自动剪裁等功能。这次要完善以下功能:
1.添加自定义图片来源,相册,摄像头获取。
2.使用真实的随机问题数据。
3.原图放大缩小提示。
4.menu菜单,以及"编辑"功能实现。
同样的,先上程序运行效果,再具体讨论一下功能的实现细节
一、从相册、摄像头获取图片添加问题数据。
/**
* 调用系统摄像头进行拍照,并指定保存路径
*
*/
public static void startCameraAndSaveImage(Activity activity,int requestCode,String filePath,String fileName) {
File f=new File(filePath + fileName + ".jpg");
Uri u=Uri.fromFile(f);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, u);
intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
activity.startActivityForResult(intent, requestCode);
}
/**
* 调用系统相册
* @param activity
* @param requestCode
*/
public static void startAblum(Activity activity,int requestCode) {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
activity.startActivityForResult(intent, requestCode);
}
上面两个方法是调用摄像头和相册的方法,从代码中的startActivtyForResult()可以看出,我们需要调用类中重写onActivityResult()方法来捕获处理返回的Intent数据。具体如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == Activity.RESULT_OK) {
SimpleDateFormat format;
Date date;
String str;
switch(requestCode) {
case Conf.requestcode_camera:
//相机保存的大图路径
File file = new File(ImageTool.getRootPath(MainActivity.this) + cameraFile + ".jpg");
if(file.exists()) {
//1.创建缩略图
Bitmap bitmapOriginal = BitmapFactory.decodeFile(file.toString());
Bitmap snapBitmap;
File snapImage = new File(ImageTool.getRootPath(MainActivity.this) + cameraFile + "_snap.jpg");
if(!snapImage.exists()) {
try {
snapImage.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
FileOutputStream fos_small = null;
try {
fos_small = new FileOutputStream(snapImage);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
snapBitmap = bitmapOriginal.createScaledBitmap(bitmapOriginal,120, 120, false);
snapBitmap.compress(Bitmap.CompressFormat.JPEG, 100,fos_small);
//2.入库
PuzzleDao.save(MainActivity.this
, new Puzzle(ImageTool.getRootPath(MainActivity.this) + cameraFile + ".jpg"
, ImageTool.getRootPath(MainActivity.this) + cameraFile + "_snap.jpg"
, CommTool.encodePuzzle(new PuzzleGenerator().getPuzzleData())
, false));
//3.刷新界面
list = PuzzleDao.getPuzzleList(MainActivity.this);
adapter.notifyDataSetChanged();
cameraFile = null;
}
break;
case Conf.requestcode_ablum:
//1.将得到的图片保存一份到程序文件夹,并创建缩略图
format = new SimpleDateFormat("yyyyMMddHHmmss");
date = new Date();
str = format.format(date);
if(new ImageTool(MainActivity.this).saveImageToSD(MainActivity.this,data,str)) {
//2.生成问题数据,保存到数据库
PuzzleDao.save(MainActivity.this
, new Puzzle(ImageTool.getRootPath(MainActivity.this) + str + ".jpg"
, ImageTool.getRootPath(MainActivity.this) + str + "_snap.jpg"
, CommTool.encodePuzzle(new PuzzleGenerator().getPuzzleData())
, false));
}
//3.刷新界面
list = PuzzleDao.getPuzzleList(MainActivity.this);
adapter.notifyDataSetChanged();
break;
}
}
}
特别地:
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, Conf.requestcode_ablum);
其中setDataAndType()的第一个参数可以设置成想要读取的目录,这样在弹出的相册中就会只显示该指定目录下的图片。还有就是由于本应用的需求,这里涉及到缩略图的创建和问题数据的持久化动作。总结其顺序为:生成缩略图->生成问题数据->持久化问题数据->刷新界面。
二、提示对话框的实现
自定义一个Dialog,其内包含一个ImageView用于显示已复原的图片。并为该ImageView注册单击事件,使单击隐藏Dialog。
/**
* 自定义Dialog,用于显示已复原图片
* @author wly
*
*/
public class Large_ImagePopup extends Dialog {
Context context;
public Large_ImagePopup(Context context) {
super(context);
this.context = context;
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.pop_image);
Display d = ((Activity) context).getWindowManager()
.getDefaultDisplay();
int w = d.getWidth();
int h = d.getHeight();
getWindow().setBackgroundDrawable(
new ColorDrawable(android.graphics.Color.TRANSPARENT));
setCancelable(true);
setCanceledOnTouchOutside(true);
ImageView large = (ImageView) findViewById(R.id.popImage);
large.setImageBitmap(PuzzleTool.getPuzzleImageBitmap(context,
puzzle));
show();
//单击隐藏dialog
large.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cancel();
}
});
}
}
三、ActionBar在Android2.2上的兼容使用,用的是官方的support library,具体可以参考:http://developer.android.com/guide/topics/ui/actionbar.html
完成工程下载(含appcompat v7和afiinal):http://download.csdn.net/detail/u011638883/6814491
好了,虽然咱已经花了时间来做ActionBar,还自己动手做了一个logo,但显然界面还需要专门的设计优化,,笔者考虑要不要请教一下部门里的美工mm呢?
装载请保留出处:http://blog.csdn.net/u011638883/article/details/17401219
谢谢!!
这篇关于从拼图游戏开始(八)_功能完善的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!