加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 14:17:38 所属栏目:百科 来源:网络整理
导读:这两天我们游戏里面用到的了玩家自定义头像这部分,我就研究了下(其实我是一个小白的),现在做个笔记,也和大家分享以下经验。 好了废话少说我就直接贴代码了,嘎嘎。 创建了一个类 ChooseImage , import java.io.File; import java.io.FileNotFoundExcep

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

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

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


以下是效果图,

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读