从拼图游戏开始(九)_界面优化及功能完善

2024-06-14 02:08

本文主要是介绍从拼图游戏开始(九)_界面优化及功能完善,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       今天来优化一下游戏界面,因为笔者希望做出来的东西能够有人会去参考或者使用。这个版本完善了一下界面,最终效果和最初的手稿设计有所不同,因为使用了ActionBar,又改了一些细节。同时也修复了上一版中快速反复单击移动块是可能出现的错乱问题的bug。运行效果如下:

 

        一、大图片内存溢出问题

        向这种图片列表,且列表中显示的是大图的情况。通常都需要处理内存溢出的问题,笔者之前也没注意,后来就频繁报内存溢出的问题。现在做了简单的处理,处理方法有两种:一是在保存图片时就将图片压缩到指定尺寸,这样在读取时就不需要做处理。二是在读取时将图片压缩到指定尺寸后再加载到内存。笔者这里用的是第二种方法:

/**
* 从资源文件中得到指定大小的尺寸的图片
* @param res
* @param resId
* @param reqWidth
* @param reqHeight
* @return
*/
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
/**
* 从SD卡中得到指定大小的尺寸的图片
* @param res
* @param resId
* @param reqWidth
* @param reqHeight
* @return
*/
public static Bitmap decodeSampledBitmapFromSD(Resources res, String filePath,
int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(filePath, options);
}
/**
* 计算sampleSize
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 4;
if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}

        以上主要有个步骤:1.计算sampleSize。2.根据计算得到的sampleSize和目标尺寸得到目标bitmap。

        二、自定义组件的屏幕适配

        自定义组件的屏幕适配,想本应用中的移动方格,就需要进行动态处理。实现的思路就是根据组件所在屏幕的宽高百分比进行组件的生成。有兴趣的朋友可以看一下笔者的另一篇将屏幕适配的博客:Android多屏幕适配技巧整理

              三、组件截图的实现

        本来问题列表是new了多个尺寸小一点的GamePanel组件实现的,但是发现这样的动态创建十分占用内存,导致程序运行速度受到很到的影响。现在的处理方法是在PuzzleDetailActivity的onPause中保存截图。然后在问题列表中读取缩略图图片。代码如下:

	/**
* 保存缩略图样式的puzzle
* @param context
* @param panel
* @param puzzle
*/
public static void savePuzzleBitmap(Context context,GamePanel panel,Puzzle puzzle) {
panel.setDrawingCacheEnabled(true);
panel.buildDrawingCache();
Bitmap bitmap = panel.getDrawingCache();
bitmap = bitmap.createScaledBitmap(bitmap
, Conf.snap_tile_size * 4
,  Conf.snap_tile_size * 4, false);
if(bitmap != null) {
ImageTool.saveBitmapToSD(context, bitmap,puzzle.getSnapPath());
}
}

         注意使用getDrawingCache()方法获取组件截图时,如果组件包含透明像素,则透明像素会被黑色填充。

              四、调用相机/相册的同时支持图片剪裁功能(保证显示效果的整齐,统一)

	/**
* 调用图片编辑界面
* @param activity
* @param data
* @param requestCode
*/
public static void editPicture(Activity activity,Uri data,int requestCode) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(data, "image/*");
intent.putExtra("crop", "true");//可裁剪
intent.putExtra("aspectX", 1); 
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, data);
intent.putExtra("return-data", true);//若为false则表示不返回数据
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); 
activity.startActivityForResult(intent, requestCode);
}

       剪切图片的代码参考博文:

       http://my.eoe.cn/yaming/archive/89.html

       好了,界面还是比较耗时的。不过总算基本整齐、干净了。至此拼图游戏的开发过程已基本结束,后面笔者还会例行写一篇总结。也许笔者还会再一些优化,比如做一个开场动画,考虑一下关卡设计之类的东西。不过这些已不再本系列博客的计划范围之内了,如果有新版本,笔者会上传效果的。

        O啦~~~

这篇关于从拼图游戏开始(九)_界面优化及功能完善的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059078

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k