Merge "Pixel were missing on the last line of text when using MaxLines." into honeycomb

This commit is contained in:
Gilles Debunne
2011-01-31 18:14:05 -08:00
committed by Android (Google) Code Review
4 changed files with 61 additions and 39 deletions

View File

@@ -92,7 +92,7 @@ extends Layout
} else {
mInts = new PackedIntVector(COLUMNS_NORMAL);
mEllipsizedWidth = width;
mEllipsizeAt = ellipsize;
mEllipsizeAt = null;
}
mObjects = new PackedObjectVector<Directions>(1);
@@ -259,10 +259,9 @@ extends Layout
reflowed = new StaticLayout(true);
reflowed.generate(text, where, where + after,
getPaint(), getWidth(), getAlignment(),
getSpacingMultiplier(), getSpacingAdd(),
false, true, mEllipsize,
mEllipsizedWidth, mEllipsizeAt);
getPaint(), getWidth(), getAlignment(),
getSpacingMultiplier(), getSpacingAdd(),
false, true, mEllipsizedWidth, mEllipsizeAt);
int n = reflowed.getLineCount();
// If the new layout has a blank line at the end, but it is not
@@ -391,9 +390,7 @@ extends Layout
return mEllipsizedWidth;
}
private static class ChangeWatcher
implements TextWatcher, SpanWatcher
{
private static class ChangeWatcher implements TextWatcher, SpanWatcher {
public ChangeWatcher(DynamicLayout layout) {
mLayout = new WeakReference<DynamicLayout>(layout);
}
@@ -407,12 +404,10 @@ extends Layout
((Spannable) s).removeSpan(this);
}
public void beforeTextChanged(CharSequence s,
int where, int before, int after) {
public void beforeTextChanged(CharSequence s, int where, int before, int after) {
}
public void onTextChanged(CharSequence s,
int where, int before, int after) {
public void onTextChanged(CharSequence s, int where, int before, int after) {
reflow(s, where, before, after);
}
@@ -429,8 +424,7 @@ extends Layout
reflow(s, start, end - start, end - start);
}
public void onSpanChanged(Spannable s, Object o, int start, int end,
int nstart, int nend) {
public void onSpanChanged(Spannable s, Object o, int start, int end, int nstart, int nend) {
if (o instanceof UpdateLayout) {
reflow(s, start, end - start, end - start);
reflow(s, nstart, nend - nstart, nend - nstart);

View File

@@ -1764,4 +1764,15 @@ public abstract class Layout {
new Directions(new int[] { 0, RUN_LENGTH_MASK });
/* package */ static final Directions DIRS_ALL_RIGHT_TO_LEFT =
new Directions(new int[] { 0, RUN_LENGTH_MASK | RUN_RTL_FLAG });
/**
* Inform this layout that not all of its lines will be displayed, because a maximum number of
* lines has been set on the associated TextView.
*
* A non positive value means that all lines are displayed.
*
* @param line line number of the last visible line (line numbers start at 1 for the first line)
* @hide
*/
public void setMaximumVisibleLineCount(int line) {}
}

View File

@@ -98,7 +98,7 @@ public class StaticLayout extends Layout
generate(source, bufstart, bufend, paint, outerwidth, align,
spacingmult, spacingadd, includepad, includepad,
ellipsize != null, ellipsizedWidth, ellipsize);
ellipsizedWidth, ellipsize);
mMeasured = MeasuredText.recycle(mMeasured);
mFontMetricsInt = null;
@@ -119,8 +119,7 @@ public class StaticLayout extends Layout
Alignment align,
float spacingmult, float spacingadd,
boolean includepad, boolean trackpad,
boolean breakOnlyAtSpaces,
float ellipsizedWidth, TextUtils.TruncateAt where) {
float ellipsizedWidth, TextUtils.TruncateAt ellipsize) {
mLineCount = 0;
int v = 0;
@@ -281,8 +280,7 @@ public class StaticLayout extends Layout
int emoji = Character.codePointAt(chs, j - paraStart);
if (emoji >= MIN_EMOJI && emoji <= MAX_EMOJI) {
Bitmap bm = EMOJI_FACTORY.
getBitmapFromAndroidPua(emoji);
Bitmap bm = EMOJI_FACTORY.getBitmapFromAndroidPua(emoji);
if (bm != null) {
Paint whichPaint;
@@ -362,7 +360,8 @@ public class StaticLayout extends Layout
okbottom = fitbottom;
}
} else {
if (breakOnlyAtSpaces) {
if (ellipsize != null) {
// Break only at spaces using ok indexes.
if (ok != here) {
// Log.e("text", "output ok " + here + " to " +ok);
@@ -379,7 +378,7 @@ public class StaticLayout extends Layout
needMultiply, paraStart, chdirs, dir, easy,
ok == bufend, includepad, trackpad,
chs, widths, here - paraStart,
where, ellipsizedWidth, okwidth,
ellipsize, ellipsizedWidth, okwidth,
paint);
here = ok;
@@ -415,7 +414,7 @@ public class StaticLayout extends Layout
needMultiply, paraStart, chdirs, dir, easy,
ok == bufend, includepad, trackpad,
chs, widths, here - paraStart,
where, ellipsizedWidth, okwidth,
ellipsize, ellipsizedWidth, okwidth,
paint);
here = ok;
@@ -431,7 +430,7 @@ public class StaticLayout extends Layout
needMultiply, paraStart, chdirs, dir, easy,
fit == bufend, includepad, trackpad,
chs, widths, here - paraStart,
where, ellipsizedWidth, fitwidth,
ellipsize, ellipsizedWidth, fitwidth,
paint);
here = fit;
@@ -453,7 +452,7 @@ public class StaticLayout extends Layout
here + 1 == bufend, includepad,
trackpad,
chs, widths, here - paraStart,
where, ellipsizedWidth,
ellipsize, ellipsizedWidth,
widths[here - paraStart], paint);
here = here + 1;
@@ -502,7 +501,7 @@ public class StaticLayout extends Layout
needMultiply, paraStart, chdirs, dir, easy,
paraEnd == bufend, includepad, trackpad,
chs, widths, here - paraStart,
where, ellipsizedWidth, w, paint);
ellipsize, ellipsizedWidth, w, paint);
}
paraStart = paraEnd;
@@ -525,7 +524,7 @@ public class StaticLayout extends Layout
needMultiply, bufend, null, DEFAULT_DIR, true,
true, includepad, trackpad,
null, null, bufstart,
where, ellipsizedWidth, 0, paint);
ellipsize, ellipsizedWidth, 0, paint);
}
}
@@ -738,13 +737,13 @@ public class StaticLayout extends Layout
} else {
mLineDirections[j] = AndroidBidi.directions(dir, chdirs, widstart, chs,
widstart, end - start);
}
// If ellipsize is in marquee mode, do not apply ellipsis on the first line
if (ellipsize != null && (ellipsize != TextUtils.TruncateAt.MARQUEE || j != 0)) {
calculateEllipsis(start, end, widths, widstart,
ellipsiswidth, ellipsize, j,
textwidth, paint);
}
// If ellipsize is in marquee mode, do not apply ellipsis on the first line
if (ellipsize != null && (ellipsize != TextUtils.TruncateAt.MARQUEE || j != 0)) {
calculateEllipsis(start, end, widths, widstart,
ellipsiswidth, ellipsize, j,
textwidth, paint);
}
mLineCount++;
@@ -755,7 +754,6 @@ public class StaticLayout extends Layout
float[] widths, int widstart,
float avail, TextUtils.TruncateAt where,
int line, float textwidth, TextPaint paint) {
int len = lineend - linestart;
if (textwidth <= avail) {
// Everything fits!
@@ -766,6 +764,7 @@ public class StaticLayout extends Layout
float ellipsiswid = paint.measureText("\u2026");
int ellipsisStart, ellipsisCount;
int len = lineend - linestart;
if (where == TextUtils.TruncateAt.START) {
float sum = 0;
@@ -865,12 +864,22 @@ public class StaticLayout extends Layout
@Override
public int getLineTop(int line) {
return mLines[mColumns * line + TOP];
int top = mLines[mColumns * line + TOP];
if (mMaximumVisibleLineCount > 0 && line >= mMaximumVisibleLineCount &&
line != mLineCount) {
top += getBottomPadding();
}
return top;
}
@Override
public int getLineDescent(int line) {
return mLines[mColumns * line + DESCENT];
int descent = mLines[mColumns * line + DESCENT];
if (mMaximumVisibleLineCount > 0 && line >= mMaximumVisibleLineCount - 1 &&
line != mLineCount) {
descent += getBottomPadding();
}
return descent;
}
@Override
@@ -926,6 +935,14 @@ public class StaticLayout extends Layout
return mEllipsizedWidth;
}
/**
* @hide
*/
@Override
public void setMaximumVisibleLineCount(int line) {
mMaximumVisibleLineCount = line;
}
private int mLineCount;
private int mTopPadding, mBottomPadding;
private int mColumns;
@@ -943,6 +960,7 @@ public class StaticLayout extends Layout
private int[] mLines;
private Directions[] mLineDirections;
private int mMaximumVisibleLineCount = 0;
private static final int START_MASK = 0x1FFFFFFF;
private static final int DIR_SHIFT = 30;

View File

@@ -5861,6 +5861,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
desired += pad;
layout.setMaximumVisibleLineCount(0);
if (mMaxMode == LINES) {
/*
@@ -5869,8 +5870,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
*/
if (cap) {
if (linecount > mMaximum) {
desired = layout.getLineTop(mMaximum) +
layout.getBottomPadding();
layout.setMaximumVisibleLineCount(mMaximum);
desired = layout.getLineTop(mMaximum);
if (dr != null) {
desired = Math.max(desired, dr.mDrawableHeightLeft);
@@ -6438,7 +6439,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
if (applyTransformation) {
setTransformationMethod(SingleLineTransformationMethod.getInstance());
}
// TODO setState
} else {
if (changeMaxLines) {
setMaxLines(Integer.MAX_VALUE);
@@ -6447,7 +6447,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
if (applyTransformation) {
setTransformationMethod(null);
}
// TODO setState
}
}