Speedup TextView fades (no more layers required.)

Also fixes a crash in the drop shadows cache and improves
drop shadows caching.

Change-Id: I9c0208a49467f9201d786ae0c129194b8d423923
This commit is contained in:
Romain Guy
2010-08-18 20:48:33 -07:00
parent 1b196022ec
commit c4d8eb6fb7
3 changed files with 38 additions and 10 deletions

View File

@ -1729,7 +1729,7 @@ public abstract class Layout {
private Alignment mAlignment = Alignment.ALIGN_NORMAL;
private float mSpacingMult;
private float mSpacingAdd;
private static Rect sTempRect = new Rect();
private static final Rect sTempRect = new Rect();
private boolean mSpannedText;
public static final int DIR_LEFT_TO_RIGHT = 1;

View File

@ -197,6 +197,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private static final int PRIORITY = 100;
private int mCurrentAlpha = 255;
private ColorStateList mTextColor;
private int mCurTextColor;
private ColorStateList mHintTextColor;
@ -3856,6 +3857,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
}
@Override
protected boolean onSetAlpha(int alpha) {
if (mMovement == null && getBackground() == null) {
mCurrentAlpha = alpha;
final Drawables dr = mDrawables;
if (dr != null) {
if (dr.mDrawableLeft != null) dr.mDrawableLeft.setAlpha(alpha);
if (dr.mDrawableTop != null) dr.mDrawableTop.setAlpha(alpha);
if (dr.mDrawableRight != null) dr.mDrawableRight.setAlpha(alpha);
if (dr.mDrawableBottom != null) dr.mDrawableBottom.setAlpha(alpha);
}
return true;
}
return false;
}
@Override
protected void onDraw(Canvas canvas) {
restartMarqueeIfNeeded();
@ -3953,6 +3970,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
mTextPaint.setColor(color);
mTextPaint.setAlpha(mCurrentAlpha);
mTextPaint.drawableState = getDrawableState();
canvas.save();

View File

@ -29,13 +29,18 @@ namespace android {
namespace uirenderer {
struct ShadowText {
ShadowText() { }
ShadowText() {
text = NULL;
}
ShadowText(SkPaint* paint, uint32_t radius, uint32_t len, const char* srcText):
paint(paint), radius(radius), len(len) {
radius(radius), len(len) {
text = new char[len];
memcpy(text, srcText, len);
textSize = paint->getTextSize();
typeface = paint->getTypeface();
hash = 0;
uint32_t multiplier = 1;
for (uint32_t i = 0; i < len; i++) {
@ -46,7 +51,8 @@ struct ShadowText {
}
ShadowText(const ShadowText& shadow):
paint(shadow.paint), radius(shadow.radius), len(shadow.len), hash(shadow.hash) {
radius(shadow.radius), len(shadow.len), hash(shadow.hash),
textSize(shadow.textSize), typeface(shadow.typeface) {
text = new char[shadow.len];
memcpy(text, shadow.text, shadow.len);
}
@ -55,10 +61,11 @@ struct ShadowText {
delete[] text;
}
SkPaint* paint;
uint32_t radius;
uint32_t len;
uint32_t hash;
float textSize;
SkTypeface* typeface;
char *text;
bool operator<(const ShadowText& rhs) const {
@ -66,11 +73,14 @@ struct ShadowText {
else if (len == rhs.len) {
if (radius < rhs.radius) return true;
else if (radius == rhs.radius) {
if (paint < rhs.paint) return true;
else if (paint == rhs.paint) {
if (hash < rhs.hash) return true;
if (hash == rhs.hash) {
return strncmp(text, rhs.text, len) < 0;
if (textSize < rhs.textSize) return true;
else if (textSize == rhs.textSize) {
if (typeface < rhs.typeface) return true;
else if (typeface == rhs.typeface) {
if (hash < rhs.hash) return true;
if (hash == rhs.hash) {
return strncmp(text, rhs.text, len) < 0;
}
}
}
}