Android4.4 TextView跑馬燈卡頓問題
阿新 • • 發佈:2019-01-02
前段時間在維護Android系統的時候,遇到TextView,一旦添加了跑馬燈後,UI就出現卡頓的情況。針對這個情況,對Android TextView的原始碼進行了一系列的分析和測試,最終找到了原因,如下:
在建構函式裡面的一段程式碼
修改前:
public TextView(Context context, AttributeSet attrs, int defStyle) {
......
switch (ellipsize) {
case 1:
setEllipsize(TextUtils.TruncateAt.START);
break;
case 2:
setEllipsize(TextUtils.TruncateAt.MIDDLE);
break;
case 3:
setEllipsize(TextUtils.TruncateAt.END);
break;
case 4:
if (ViewConfiguration.get(context).isFadingMarqueeEnabled()) {
setHorizontalFadingEdgeEnabled(true);
mMarqueeFadeMode = MARQUEE_FADE_NORMAL;
} else {
setHorizontalFadingEdgeEnabled(false);
mMarqueeFadeMode = MARQUEE_FADE_SWITCH_SHOW_ELLIPSIS;
}
setEllipsize(TextUtils.TruncateAt.MARQUEE);
break;
}
......
}
修改後:
public TextView(Context context, AttributeSet attrs, int defStyle) {
......
switch (ellipsize) {
case 1:
setEllipsize(TextUtils.TruncateAt.START);
break;
case 2:
setEllipsize(TextUtils.TruncateAt.MIDDLE);
break;
case 3:
setEllipsize(TextUtils.TruncateAt.END);
break;
case 4:
/*if (ViewConfiguration.get(context).isFadingMarqueeEnabled()) {
setHorizontalFadingEdgeEnabled(true);
mMarqueeFadeMode = MARQUEE_FADE_NORMAL;
} else {
setHorizontalFadingEdgeEnabled(false);
mMarqueeFadeMode = MARQUEE_FADE_SWITCH_SHOW_ELLIPSIS;
}*/
setEllipsize(TextUtils.TruncateAt.MARQUEE);
break;
}
......
}
總結:
註釋掉的地方的功能是TextView左右的陰影部分,註釋掉後,跑馬燈左右沒有陰影效果,所以也不算是根治此問題,只能夠說變相的優化了。但是我對比過要不要陰影的效果,不特別去注意的話是看不出有什麼不同的。Android4.4繪製UI感覺是有些問問題,在Server使用WindowManager畫UI的時候,明顯比Android5.0以上卡很多,具體原因沒有過多去跟了,有繼續往下跟的大神,找到原因了的話,可以分享一下,感謝!
在建構函式裡面的一段程式碼
修改前:
public TextView(Context context, AttributeSet attrs, int defStyle) {
......
switch (ellipsize) {
case 1:
setEllipsize(TextUtils.TruncateAt.START);
break;
case 2:
setEllipsize(TextUtils.TruncateAt.MIDDLE);
break;
case 3:
setEllipsize(TextUtils.TruncateAt.END);
break;
case 4:
if (ViewConfiguration.get(context).isFadingMarqueeEnabled()) {
setHorizontalFadingEdgeEnabled(true);
mMarqueeFadeMode = MARQUEE_FADE_NORMAL;
} else {
setHorizontalFadingEdgeEnabled(false);
mMarqueeFadeMode = MARQUEE_FADE_SWITCH_SHOW_ELLIPSIS;
}
setEllipsize(TextUtils.TruncateAt.MARQUEE);
break;
}
......
}
修改後:
public TextView(Context context, AttributeSet attrs, int defStyle) {
......
switch (ellipsize) {
case 1:
setEllipsize(TextUtils.TruncateAt.START);
break;
case 2:
setEllipsize(TextUtils.TruncateAt.MIDDLE);
break;
case 3:
setEllipsize(TextUtils.TruncateAt.END);
break;
case 4:
/*if (ViewConfiguration.get(context).isFadingMarqueeEnabled()) {
setHorizontalFadingEdgeEnabled(true);
mMarqueeFadeMode = MARQUEE_FADE_NORMAL;
} else {
setHorizontalFadingEdgeEnabled(false);
mMarqueeFadeMode = MARQUEE_FADE_SWITCH_SHOW_ELLIPSIS;
}*/
setEllipsize(TextUtils.TruncateAt.MARQUEE);
break;
}
......
}
總結:
註釋掉的地方的功能是TextView左右的陰影部分,註釋掉後,跑馬燈左右沒有陰影效果,所以也不算是根治此問題,只能夠說變相的優化了。但是我對比過要不要陰影的效果,不特別去注意的話是看不出有什麼不同的。Android4.4繪製UI感覺是有些問問題,在Server使用WindowManager畫UI的時候,明顯比Android5.0以上卡很多,具體原因沒有過多去跟了,有繼續往下跟的大神,找到原因了的話,可以分享一下,感謝!