今天在绘制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的倍数,则找不到对应的方向。
至于为什么三星手机没有崩溃,知道的大佬请评论区告知一下,多谢!