admin管理员组文章数量:1616680
最近一直在开发自己公司的SDK,前段时间把SDK的总体框架搭好了。就进入了实际功能的开发。SDK的第一个功能就是游客登录功能。换一种说法是试玩账号登录。就是由后台给用户分配账号和密码。用户可以跳过注册,和登录的步骤直接进入游戏体验。相信很多游戏都是会有这个功能的。所以我们公司也不例外!
废话少说,直接进入正题。先说说功能实现的需求,很简单。
1.用户点击游客登录时,弹出对话框提示用户:当前是试玩账号,要尽快绑定为正式账号,同时我们会保存试玩账号的截图到本地
2.通过一系列字段去请求后台,获取试玩账号和密码。然后显示到界面上
3.保存截图到本地。
需求就这么多,前面其实都很简单的。就是一些常规操作,接下来我要重点说的是,保存截图到本地。我是怎么实现的。因为我是使用Dialog方式显示的,刚开始使用了
View dView = ((Activity) HWControl.getInstance().getContext()).getWindow().getDecorView();
dView.setDrawingCacheEnabled(true);
dView.buildDrawingCache();
Bitmap bitmap1 = Bitmap.createBitmap(dView.getDrawingCache());
这种方式进行截图的。但是这就有很大的问题了!因为这个getDecorView只能获取到对应activity的顶层view。而Dialog是悬浮在activity之上的。所以截取出来的图,是没有Dialog的。好了,我想activity不行的,那我直接用Dialog对象对获取截图。于是就有了下面的代码
//如果需要同时保存打开的dialog的截图,可以这么做,如果不需要,上面的bitmap就是当前activity的截图了。
View dialogView = LoginTrialDialog.getInstance().getDialog().getWindow().getDecorView();
LogUtils.e("dialogView---->"+dialogView);
int location2[] = new int[2];
dialogView.getLocationOnScreen(location2);
dialogView.setDrawingCacheEnabled(true);
dialogView.buildDrawingCache();
但是这还是有问题的,就是截出来的图,高度是不对的。这是什么问题,我目前还没有找不出来。因为这个问题,让我浪费了很多时间。换了很多种姿势去截这块图,就是截出来不正常。后来灵机一动,我发现我没必要一直纠结怎么去截图实现这个功能啊。我可以直接通过canvas 去画出来。然后保存为本地图片。这样一来我就不用想怎么去截图了。
我可以通过canvas 拿到相应的资源,去画出来。直接上代码
/**
* 我们先画要保存的图
*/
Bitmap localBitmap1 = getBitmap(paramContext, "fg_guest_find_uid");//背景图片
int width = localBitmap1.getWidth();
int height = localBitmap1.getHeight();
Bitmap localBitmap2 = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
Canvas localCanvas = new Canvas(localBitmap2);//绘制背景
localCanvas.drawBitmap(localBitmap1, 0.0F, 0.0F, null);
Paint localPaint = new Paint();//获取画笔
localPaint.setColor(ResLoader.getColor(paramContext, "fg_find_text"));//设置画笔颜色
localPaint.setAntiAlias(true);
localPaint.setFilterBitmap(true);
localPaint.setTextSize(20);
localCanvas.drawText(paramString3,
(width - getFontlength(localPaint, paramString3)) / 2.0F,
height * 665 / 1920, localPaint);//根据位置 绘制相应的账号密码等
localCanvas.drawText(paramString1,
(width - getFontlength(localPaint, paramString1)) / 2.0F,
height * 980 / 1920, localPaint);
localCanvas.drawText(paramString2,
(width - getFontlength(localPaint, paramString2)) / 2.0F,
height * 1280 / 1920, localPaint);
localCanvas.save(31);
localCanvas.restore();
画出图片后,接下来就是保存图片了。
/**
* 保存图片到本地
*/
String str1 = Constant.GAME_FILE_PATH + paramContext.getPackageName();
LogUtils.e("保存图片路径名str1----->" + str1);
String str2 = str1 + File.separator + paramString + ".jpg";
LogUtils.e("保存图片路径名str2----->" + str2);
File localFile1 = new File(str1);
File localFile2 = new File(str2);
if (!localFile1.exists()) {
localFile1.mkdirs();
}
try {
if (localFile2.exists()) {
localFile2.createNewFile();
}
LogUtils.e("这里执行了---->"+localFile2.getPath());
FileOutputStream localFileOutputStream1 = new FileOutputStream(localFile2);
paramBitmappress(Bitmap.CompressFormat.JPEG, 100,
localFileOutputStream1);
Intent localIntent = new Intent(
"android.intent.action.MEDIA_SCANNER_SCAN_FILE");
localIntent.setData(Uri.fromFile(localFile2));
paramContext.sendBroadcast(localIntent);
} catch (FileNotFoundException e) {
LogUtils.e("fileNotFoudExceptrin---->"+e.toString());
} catch (IOException ex) {
LogUtils.e("IOException---->"+ex.toString());
}
最后去看一波手机里面图库,很完美!我要的图,很安详地趟在图库里面了。通过这一个功能我总结了一个经验,有时候我们拿到一个需求的时候,太在乎怎么做,却忘记了为什么做。通往目标的路,都不是只有一条的。这条路走不通,我们就开始选择换条路前进了。
我是一名Android工程师,我为自己加油!
版权声明:本文标题:开发SDK必备!保存游客登录的账号密码截图到本地。 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1728747797a1171449.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论