summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorAlan Viverette <alanv@google.com>2013-09-25 22:21:07 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-09-25 22:21:08 +0000
commit812b64264176cb8a253a8253074bc9595503d2ac (patch)
treea641dd4b797aadabc00a54670a117f6a07ccb47f /core
parent3264ec7ab5efe8592523a68d4b69c5f2f8f514da (diff)
parent7fe420f31b4de2bbd7a89194384d0c9ac6293226 (diff)
downloadframeworks_base-812b64264176cb8a253a8253074bc9595503d2ac.zip
frameworks_base-812b64264176cb8a253a8253074bc9595503d2ac.tar.gz
frameworks_base-812b64264176cb8a253a8253074bc9595503d2ac.tar.bz2
Merge "Fix caption rendering" into klp-dev
Diffstat (limited to 'core')
-rw-r--r--core/java/com/android/internal/widget/SubtitleView.java137
1 files changed, 48 insertions, 89 deletions
diff --git a/core/java/com/android/internal/widget/SubtitleView.java b/core/java/com/android/internal/widget/SubtitleView.java
index 356401c..e30c1ff 100644
--- a/core/java/com/android/internal/widget/SubtitleView.java
+++ b/core/java/com/android/internal/widget/SubtitleView.java
@@ -31,7 +31,6 @@ import android.graphics.Typeface;
import android.text.Layout.Alignment;
import android.text.StaticLayout;
import android.text.TextPaint;
-import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
@@ -52,14 +51,12 @@ public class SubtitleView extends View {
/** Temporary rectangle used for computing line bounds. */
private final RectF mLineBounds = new RectF();
- /** Temporary array used for computing line wrapping. */
- private float[] mTextWidths;
-
/** Reusable string builder used for holding text. */
private final StringBuilder mText = new StringBuilder();
- private final StringBuilder mBreakText = new StringBuilder();
- private TextPaint mPaint;
+ private Alignment mAlignment;
+ private TextPaint mTextPaint;
+ private Paint mPaint;
private int mForegroundColor;
private int mBackgroundColor;
@@ -122,11 +119,12 @@ public class SubtitleView extends View {
mShadowOffsetX = res.getDimension(com.android.internal.R.dimen.subtitle_shadow_offset);
mShadowOffsetY = mShadowOffsetX;
- final TextPaint paint = new TextPaint();
- paint.setAntiAlias(true);
- paint.setSubpixelText(true);
+ mTextPaint = new TextPaint();
+ mTextPaint.setAntiAlias(true);
+ mTextPaint.setSubpixelText(true);
- mPaint = paint;
+ mPaint = new Paint();
+ mPaint.setAntiAlias(true);
setText(text);
setTextSize(textSize);
@@ -174,21 +172,30 @@ public class SubtitleView extends View {
public void setTextSize(float size) {
final DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
final float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, size, metrics);
- if (mPaint.getTextSize() != size) {
- mHasMeasurements = false;
+ if (mTextPaint.getTextSize() != size) {
+ mTextPaint.setTextSize(size);
mInnerPaddingX = (int) (size * INNER_PADDING_RATIO + 0.5f);
- mPaint.setTextSize(size);
- requestLayout();
+ mHasMeasurements = false;
+ forceLayout();
}
}
public void setTypeface(Typeface typeface) {
- if (mPaint.getTypeface() != typeface) {
+ if (mTextPaint.getTypeface() != typeface) {
+ mTextPaint.setTypeface(typeface);
+
mHasMeasurements = false;
- mPaint.setTypeface(typeface);
+ forceLayout();
+ }
+ }
- requestLayout();
+ public void setAlignment(Alignment textAlignment) {
+ if (mAlignment != textAlignment) {
+ mAlignment = textAlignment;
+
+ mHasMeasurements = false;
+ forceLayout();
}
}
@@ -222,63 +229,19 @@ public class SubtitleView extends View {
}
// Account for padding.
- final int paddingX = mPaddingLeft + mPaddingRight + mInnerPaddingX;
+ final int paddingX = mPaddingLeft + mPaddingRight + mInnerPaddingX * 2;
maxWidth -= paddingX;
-
if (maxWidth <= 0) {
return false;
}
- final TextPaint paint = mPaint;
- final CharSequence text = mText;
- final int textLength = text.length();
- if (mTextWidths == null || mTextWidths.length < textLength) {
- mTextWidths = new float[textLength];
- }
-
- final float[] textWidths = mTextWidths;
- paint.getTextWidths(text, 0, textLength, textWidths);
-
- // Compute total length.
- float runLength = 0;
- for (int i = 0; i < textLength; i++) {
- runLength += textWidths[i];
- }
-
- final int lineCount = (int) (runLength / maxWidth) + 1;
- final int lineLength = (int) (runLength / lineCount);
-
- // Build line break buffer.
- final StringBuilder breakText = mBreakText;
- breakText.setLength(0);
-
- int line = 0;
- int lastBreak = 0;
- int maxRunLength = 0;
- runLength = 0;
- for (int i = 0; i < textLength; i++) {
- if (runLength > lineLength) {
- final CharSequence sequence = text.subSequence(lastBreak, i);
- final int trimmedLength = TextUtils.getTrimmedLength(sequence);
- breakText.append(sequence, 0, trimmedLength);
- breakText.append('\n');
- lastBreak = i;
- runLength = 0;
- }
-
- runLength += textWidths[i];
-
- if (runLength > maxRunLength) {
- maxRunLength = (int) Math.ceil(runLength);
- }
- }
- breakText.append(text.subSequence(lastBreak, textLength));
-
+ // TODO: Implement minimum-difference line wrapping. Adding the results
+ // of Paint.getTextWidths() seems to return different values than
+ // StaticLayout.getWidth(), so this is non-trivial.
mHasMeasurements = true;
mLastMeasuredWidth = maxWidth;
-
- mLayout = new StaticLayout(breakText, paint, maxRunLength, Alignment.ALIGN_LEFT,
- mSpacingMult, mSpacingAdd, true);
+ mLayout = new StaticLayout(
+ mText, mTextPaint, maxWidth, mAlignment, mSpacingMult, mSpacingAdd, true);
return true;
}
@@ -316,54 +279,50 @@ public class SubtitleView extends View {
final int innerPaddingX = mInnerPaddingX;
c.translate(mPaddingLeft + innerPaddingX, mPaddingTop);
- final RectF bounds = mLineBounds;
final int lineCount = layout.getLineCount();
- final Paint paint = layout.getPaint();
- paint.setShadowLayer(0, 0, 0, 0);
-
- final int backgroundColor = mBackgroundColor;
- if (Color.alpha(backgroundColor) > 0) {
- paint.setColor(backgroundColor);
- paint.setStyle(Style.FILL);
+ final Paint textPaint = mTextPaint;
+ final Paint paint = mPaint;
+ final RectF bounds = mLineBounds;
+ if (Color.alpha(mBackgroundColor) > 0) {
final float cornerRadius = mCornerRadius;
float previousBottom = layout.getLineTop(0);
+ paint.setColor(mBackgroundColor);
+ paint.setStyle(Style.FILL);
+
for (int i = 0; i < lineCount; i++) {
- bounds.left = layout.getLineLeft(i) - innerPaddingX;
+ bounds.left = layout.getLineLeft(i) -innerPaddingX;
bounds.right = layout.getLineRight(i) + innerPaddingX;
bounds.top = previousBottom;
bounds.bottom = layout.getLineBottom(i);
-
previousBottom = bounds.bottom;
c.drawRoundRect(bounds, cornerRadius, cornerRadius, paint);
}
}
- final int edgeType = mEdgeType;
- if (edgeType == CaptionStyle.EDGE_TYPE_OUTLINE) {
- paint.setColor(mEdgeColor);
- paint.setStyle(Style.FILL_AND_STROKE);
- paint.setStrokeJoin(Join.ROUND);
- paint.setStrokeWidth(mOutlineWidth);
+ if (mEdgeType == CaptionStyle.EDGE_TYPE_OUTLINE) {
+ textPaint.setStrokeJoin(Join.ROUND);
+ textPaint.setStrokeWidth(mOutlineWidth);
+ textPaint.setColor(mEdgeColor);
+ textPaint.setStyle(Style.FILL_AND_STROKE);
for (int i = 0; i < lineCount; i++) {
layout.drawText(c, i, i);
}
+ } else if (mEdgeType == CaptionStyle.EDGE_TYPE_DROP_SHADOW) {
+ textPaint.setShadowLayer(mShadowRadius, mShadowOffsetX, mShadowOffsetY, mEdgeColor);
}
- if (edgeType == CaptionStyle.EDGE_TYPE_DROP_SHADOW) {
- paint.setShadowLayer(mShadowRadius, mShadowOffsetX, mShadowOffsetY, mEdgeColor);
- }
-
- paint.setColor(mForegroundColor);
- paint.setStyle(Style.FILL);
+ textPaint.setColor(mForegroundColor);
+ textPaint.setStyle(Style.FILL);
for (int i = 0; i < lineCount; i++) {
layout.drawText(c, i, i);
}
+ textPaint.setShadowLayer(0, 0, 0, 0);
c.restoreToCount(saveCount);
}
}