这两天我们游戏里面用到的了玩家自定义头像这部分,我就研究了下(其实我是一个小白的),现在做个笔记,也和大家分享以下经验。
好了废话少说我就直接贴代码了,嘎嘎。
创建了一个类 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
以下是效果图, (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|