zoukankan      html  css  js  c++  java
  • 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。

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




  • 相关阅读:
    hdu4276 依赖背包
    poj1155 依赖背包
    cf219d 基础换根法
    贪婪大陆——(树状数组)
    数星星(树状数组或者线段树)
    拓扑排序基础题——排序
    Codeforces Round #511 (Div. 1) T2 Little C Loves 3 II
    除虫药水(简单dp)
    烽火传递(单调队列优化dp,然而蒟蒻用一个优先队列做)
    ZOJ----3471Most powerful(简单状压dp)
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6964094.html
Copyright © 2011-2022 走看看