这两天我们游戏里面用到的了玩家自定义头像这部分,我就研究了下(其实我是一个小白的),现在做个笔记,也和大家分享以下经验。
好了废话少说我就直接贴代码了,嘎嘎。
创建了一个类 ChooseImage ,
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.cocos2dx.lib.Cocos2dxLuaJavaBridge;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.util.Log;
public class ChooseImage {
private static final int REQUEST_CODE_GETIMAGE_BYSDCARD = 0;// 从sd卡得到图像的请求码
private static final int REQUEST_CODE_GETIMAGE_BYCAMERA = 1;// 从相机得到图像的请求码
private static final int REQUEST_CODE_GETIMAGE_SCREENSHOT = 2;// 截取成功的请求码
private static Activity mContext;//avtivity的对象因为的我们游戏里面就一个继承了Cocos2dxActivity的avtivity
private static int imageOutputX = 168;
private static int imageOutputY = 168;
//初始化
public static void init( Activity con ){
mContext = con;
}
//degbug
public static void showTip(String str) {
Log.e("image","showTip:" + str);
}
//
public static void onActivityResult(int requestCode,int resultCode,Intent data) {
showTip("回调");
if (requestCode == REQUEST_CODE_GETIMAGE_BYSDCARD) {
showTip("sd");
if (data != null) {
Uri selectedImage = data.getData();
if (selectedImage != null) {
startPhotoZoom(selectedImage);//截取
}
}
}
// 拍摄
else if (requestCode == REQUEST_CODE_GETIMAGE_BYCAMERA) {
if (resultCode != 1) {
return;
}
File picture = new File(Environment.getExternalStorageDirectory()
+ "/temp.jpg");
startPhotoZoom(Uri.fromFile(picture));//截取
}
else if (requestCode == REQUEST_CODE_GETIMAGE_SCREENSHOT) {
showTip("截取成功2");
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap bmp = data.getParcelableExtra("data");
saveBitmapFile(bmp);
}
}
}
//保存成功之后并发送给quick cocos 中
public static void saveBitmapFile(Bitmap mBitmap){
String strDir = mContext.getFilesDir().getAbsolutePath();//获取游戏缓存路径
String strFileName = "tmp/"+String.valueOf(System.currentTimeMillis()) + ".png";//图片名字
String strImagePath = strDir + "/res/" + strFileName;
showTip( "saveBitmapFile to:"+strImagePath);
File f = new File(strImagePath);
if(!f.getParentFile().exists()){ //判断路径是否存在 不存在则创建
f.getParentFile().mkdirs();
}
try {
f.createNewFile();
} catch (IOException e) {
}
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mBitmap.compress(Bitmap.CompressFormat.PNG,100,fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
showTip( "saveBitmapFile ok:"+strImagePath);
//图片保存成功,回调游戏里面的全局函数 **注 callLuaGlobalFunctionWithString 参数1 必须是全局函数,不了解的同学可以度娘以下,在这就不详细说了。
Cocos2dxLuaJavaBridge.callLuaGlobalFunctionWithString("onImageGet",strImagePath);
} catch (IOException e) {
e.printStackTrace();
}
}
// 手机选图
public static void mobileImage()//该函数是我在游戏里面调的,大家可以视自己情况做不同的操作
{
showTip("手机图片");
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
mContext.startActivityForResult(intent,REQUEST_CODE_GETIMAGE_BYSDCARD);
}
//拍照
public static void photograph()//该函数是我在游戏里面调的
{
Intent intentC = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intentC.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File(
Environment.getExternalStorageDirectory(),"temp.jpg")));
mContext.startActivityForResult(intentC,REQUEST_CODE_GETIMAGE_BYCAMERA);
}
//设置截图的宽高
public static void setScreenshotSize(final int tempX,final int tempY) //该函数是我在游戏里面调的 ,为了设置截取图片的大小
{
imageOutputX = tempX;
imageOutputY = tempY;
}
//截图 android自带的
public static void startPhotoZoom(Uri uri) {
showTip("图片path "+uri);
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri,"image/*");
intent.putExtra("crop","true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX",1);
intent.putExtra("aspectY",1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX",imageOutputX);
intent.putExtra("outputY",imageOutputY);
intent.putExtra("return-data",true);
mContext.startActivityForResult(intent,REQUEST_CODE_GETIMAGE_SCREENSHOT);//其实第二个参数是为了onActivityResult中用,相当于一个标识
}
}
因为我们调用了android的系统头像,和用到了照相功能,在AndroidManifest.xml中添加权限
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.READ_LOGS"/>
还有在saveBitmapFile 中我们操作添加了文件也到添加权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
关于Lua 与 Java 互操作的内容大家可以参考http://blog.csdn.net/wang85632968/article/details/8977457
以下是效果图,