quick cocos2d-x 与android实现更换头像

这两天我们游戏里面用到的了玩家自定义头像这部分,我就研究了下(其实我是一个小白的),现在做个笔记,也和大家分享以下经验。

好了废话少说我就直接贴代码了,嘎嘎。

创建了一个类 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


以下是效果图,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值