Android 上的 制表符(tab) —— 一个神奇的字符 (二)

接到上回的说,主要是上回那个问题,我觉得是android的bug,黎叔觉得是cocos2dx的bug,叫我去提交bug。所以我又继续研究了下。

上回说到会调用java层的函数去创建一个image,然后作为纹理设置给精灵,在那个地方crash了,此处代码如下:

	public static void createTextBitmapShadowStroke(String pString,
			final String pFontName, final int pFontSize, final float fontTintR,
			final float fontTintG, final float fontTintB, final int pAlignment,
			final int pWidth, final int pHeight, final boolean shadow,
			final float shadowDX, final float shadowDY, final float shadowBlur,
			final boolean stroke, final float strokeR, final float strokeG,
			final float strokeB, final float strokeSize) {
                … …
		final TextProperty textProperty = Cocos2dxBitmap.computeTextProperty(
				pString, pWidth, pHeight, paint);
		final int bitmapTotalHeight = (pHeight == 0 ? textProperty.mTotalHeight
				: pHeight);
		… … 

		final Bitmap bitmap = Bitmap.createBitmap(textProperty.mMaxWidth
				+ (int) bitmapPaddingX, bitmapTotalHeight
				+ (int) bitmapPaddingY, Bitmap.Config.ARGB_8888);
		… … 

		Cocos2dxBitmap.initNativeObject(bitmap);
	}

崩溃的地方是在 Bitmap.createBitmap那里,第一个参数和第二个参数为0了,那2个参数是由textProperty获取的。再看这个textProperty。如下:

	private static TextProperty computeTextProperty(final String pString,
			final int pWidth, final int pHeight, final Paint pPaint) {
		final FontMetricsInt fm = pPaint.getFontMetricsInt();
		final int h = (int) Math.ceil(fm.bottom - fm.top);
		int maxContentWidth = 0;

		final String[] lines = Cocos2dxBitmap.splitString(pString, pWidth,
				pHeight, pPaint);

		if (pWidth != 0) {
			maxContentWidth = pWidth;
		} else {
			/* Compute the max width. */
			int temp = 0;
			for (final String line : lines) {
				temp = (int) FloatMath.ceil(pPaint.measureText(line, 0,
						line.length()));                //就在这里!!
				if (temp > maxContentWidth) {
					maxContentWidth = temp;
				}
			}
		}

		return new TextProperty(maxContentWidth, h, lines);
	}

注意那个for循环里面的东西,理解起来就是,假设有很多字,那么这个纹理的宽度,肯定是这很多字里面最宽的一行。至于这一行的宽度怎么取,就是靠pPaint去绘制的时候,看画出来是多大了,所以有一个measure的函数,可以去计算这个长度。

这个paint和这个measure都是android提供给我们的函数。如果这个宽度和高度不能为0,应该抛一个异常出来,但是android并没这么做,他就让他直接crash了,所以这一定是android的bug!!!

    不过cocos2dx在设计的时候应该也是可以避免的,可以手动判断一下这个值是否为0。

不过谁会像我这么无聊恰好发现这个问题呢。。。。

Android 上的 制表符(tab) —— 一个神奇的字符 (二),布布扣,bubuko.com

时间: 2024-10-08 06:05:10

Android 上的 制表符(tab) —— 一个神奇的字符 (二)的相关文章

Android 上的 制表符(tab) —— 一个神奇的字符 (cocos2dx crash)

今天测试发现了游戏的一个问题,系统邮件,如果发了tab,在android上一打开邮件内容就会crash.而且他们很确定是tab的问题. 凭我多个月的经验(确实没多年...)来看,从来没听说在android上会因为一个tab崩溃,而且如果有这个问题,肯定会有很多人遇到,估计早就吵翻天了,搜索了一下,什么可用信息都没有. 于是写个测试工程测试了一下,分别在mac下和windows下,用文本编辑工具编辑了4个txt文档,utf有bom和无bom,内容是" tab abcd ",发现都能正常显

Android 上的 制表符(tab) —— 一个奇妙的字符 (cocos2dx crash)

今天測试发现了游戏的一个问题,系统邮件,假设发了tab,在android上一打开邮件内容就会crash.并且他们非常确定是tab的问题. 凭我多个月的经验(确实没多年. . .)来看.从来没听说在android上会由于一个tab崩溃.并且假设有这个问题.肯定会有非常多人遇到,预计早就吵翻天了,搜索了一下,什么可用信息都没有. 于是写个測试project測试了一下.分别在mac下和windows下,用文本编辑工具编辑了4个txt文档.utf有bom和无bom,内容是" tab abcd "

Android上的HttpURLConnection

在Android上应该优先使用HttpURLConnection而不是HttpClient. conn.connect() 这句不需要显式调用,后面的方法会自动调用,但是显式调用了也不会怀孕. disconnect() 在其他的JVM实现中会关闭闲置的连接.所以一般不显示调用,但是Android的实现不同,需要调用 Once the response body has been read, the HttpURLConnection should be closed by calling dis

android上libevent dns解析的一个bug修复

在测试我们开发的一个 APK(使用了 libevent-2.1.3-alpha 作为网络库) 时发现一个奇怪的问题,域名解析有时报错 Non-recoverable name resolution failure .在公司偶尔报错,后来程序改动了一下,出错时重试几次,问题没再出现,以为好了.昨天换了个网络环境,结果报错几率变得非常大. 互联网搜索到这个错误的一个处理办法,说在使用 getnameinfo() 函数时需要显式指定其第二个参数 salen 为 sizeof(struct sockad

Android 上千实例源码分析以及开源分析

Android 上千实例源码分析以及开源分析(百度云分享) 要下载的直接翻到最后吧,项目实例有点多. 首先 介绍几本书籍(下载包中)吧. 01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 06_Android的GUI系统 07_Android的Audio系统 08_Android的Video 输入输出系统 09_Android的多媒体系统 10_

Android 上使用 iconfont 的一种便捷方案

最近在学习 AIOSO(Alibaba Internal Open Source Organization,即阿里巴巴内部开源组织) 的一个子项目MMCherryUI,这是一个流式布局,可以在运行时做动态改变子元素的个数(增删查改), 并内建动画效果,先贴一张效果图出来 我们学习代码,最重要的就是动手实践.于是,我想自己去实现一个类似上面效果的页面.首先,我需要页面上的几张 icon 图标,去哪里找?上 iconfont.cn 找,里面的 icon 最全了.这时候我脑子里浮现了一个问题,我是使用

一个神奇的递推公式--转自2108

志远兄发现了一个神奇的递推公式, 某些递推的题目可以看作, 一个个上三角阵, 而问题的解为(1,1) 至 (n,n) 的路径个数, 废话不多说, 上题上代码 以下转自http://www.cnblogs.com/--ZHIYUAN/p/5971367.html 小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9447    A

Unity3D之AssetBundle学习:Android上运行笔记

路径统一 在Android上加载StreamingAssets文件夹下的AssetBundle文件,首先需要对加载地址进行处理,注意PC.Android和IOS的地址不一致需要针对不同的平台不同的处理,通用代码如下: 1 //统一不同平台下 StreamingAssets 路径 2 public static readonly string STREAMING_ASSETS_PATH = 3 #if UNITY_ANDROID 4 "jar:file:///" + Applicatio

观察者模式在android 上的最佳实践

在上一篇文章中介绍了介绍了观察者模式的定义和一些基本概念,观察者模式在 android开发中应用还是非常广泛的,例如android按钮事件的监听.广播等等,在任何类似于新闻-订阅的模式下面都可以使用.从某种意义上面来说android有点像JAVA EE的WEB页面,在都需要提供View层用于进行操作,在多个页面之间传递数据发送通知都是一件很麻烦的事情. 在android中从A页面跳转到B页面,然后B页面进行某些操作后需要通知A页面去刷新数据,我们可以通过startActivityForResul