日常开发中偶遇一个度数引发的崩溃

280 阅读2分钟

  今天在绘制UI页面的时候,设计师使用mastergo作为设计稿提供给我,说到这里不得不吐槽mastergo的难用。在添加一个背景色的时候使用了渐变色,于是将mastergo设置为Android规则,直接复制渐变色的代码使用,运行起来效果完全没有问题,于是自信满满的提交了代码,合到了主线。

  过了大概十分钟,一个路过的同事走过来指出拉完最新代码后,一切换到我写的页面就闪退了,听到这里有点难以置信,明明测过没问题才提交的,怎么可能有问题,一定是其他人改动影响了(程序员怎么能质疑自己的代码有问题?)。话还没说完,群里各种艾特我的消息接踵而至,开发老大也怒了,让我赶紧看看。

  我拿起测试机各种操作,确实是一点问题没有。但是大家都在说拉取完代码就出现问题了,于是又借旁边同事的测试机看看,一切换果然闪退了。。看到这里心里还是有一点慌。。。

错误如下:

java.lang.IllegalArgumentException: Linear gradient requires
'angle' attribute to be a multiple of 45
	at
android.graphics.drawable.GradientDrawable$GradientState.updateGradientStateOrientation(GradientDrawable.java:2208)
	at
android.graphics.drawable.GradientDrawable$GradientState.getOrientation(GradientDrawable.java:2196)
	at
android.graphics.drawable.GradientDrawable.ensureValidRect(GradientDrawable.java:1273)
	at  

  错误显示是由于线性渐变色的度数不是45的倍数。。看到这里,赶紧检查一下代码。

    <gradient
        android:type="linear"
        android:startColor="@color/mine_partner_color"
        android:endColor="@color/white"
        android:angle="179"
         />

  果然,显示的角度是179,并不是45的倍数,但是这是从设计稿上直接复制下来的啊。(设计稿的锅,我不背)。而且自己的测试机真的是一点问题没有(三星A50s)。

这里不得不感叹一下三星系统还是厉害,是真的强,测试的国产手机无一幸免,全部崩溃。

这里解释一下为什么会出现这样的情况?

查看GradientDrawable源码可知:

   private void updateGradientDrawableGradient(Resources r, TypedArray a) {
        final GradientState st = mGradientState;
       
         ......................省略部分代码................
       
        int angle = (int) a.getFloat(R.styleable.GradientDrawableGradient_angle, st.mAngle);

              if (sWrapNegativeAngleMeasurements) {
            st.mAngle = ((angle % 360) + 360) % 360; // offset negative angle measures
        } else {
            st.mAngle = angle % 360;
        }

        if (st.mAngle >= 0) {
            switch (st.mAngle) {
                case 0:
                    st.mOrientation = Orientation.LEFT_RIGHT;
                    break;
                case 45:
                    st.mOrientation = Orientation.BL_TR;
                    break;
                case 90:
                    st.mOrientation = Orientation.BOTTOM_TOP;
                    break;
                case 135:
                    st.mOrientation = Orientation.BR_TL;
                    break;
                case 180:
                    st.mOrientation = Orientation.RIGHT_LEFT;
                    break;
                case 225:
                    st.mOrientation = Orientation.TR_BL;
                    break;
                case 270:
                    st.mOrientation = Orientation.TOP_BOTTOM;
                    break;
                case 315:
                    st.mOrientation = Orientation.TL_BR;
                    break;
            }
        } else {
            st.mOrientation = DEFAULT_ORIENTATION;
        }

      
    }

 从源码中可以看出 通过angle 解析出来的角度通过计算之后对应不同的方向,而这些方向对应的角度刚好就是45的倍数。如果不是45的倍数,则找不到对应的方向。

 至于为什么三星手机没有崩溃,知道的大佬请评论区告知一下,多谢!