Merge pull request #13 from airbnb/al/0.41-linespacing

Enable linespacing for versions >= Lollipop (5.0)
This commit is contained in:
Leland Richardson
2017-03-28 18:18:04 -07:00
committed by GitHub
5 changed files with 57 additions and 0 deletions
@@ -73,6 +73,7 @@ public class ViewProps {
public static final String FONT_STYLE = "fontStyle";
public static final String FONT_FAMILY = "fontFamily";
public static final String LINE_HEIGHT = "lineHeight";
public static final String LETTER_SPACING = "letterSpacing";
public static final String NEEDS_OFFSCREEN_ALPHA_COMPOSITING = "needsOffscreenAlphaCompositing";
public static final String NUMBER_OF_LINES = "numberOfLines";
public static final String ELLIPSIZE_MODE = "ellipsizeMode";
@@ -331,6 +331,7 @@ public class ReactTextShadowNode extends LayoutShadowNode {
}
private float mLineHeight = Float.NaN;
private float mLetterSpacing = Float.NaN;
private boolean mIsColorSet = false;
private boolean mAllowFontScaling = true;
private int mColor;
@@ -390,6 +391,14 @@ public class ReactTextShadowNode extends LayoutShadowNode {
}
}
public float getLetterSpacing() {
return mLetterSpacing;
}
public int getFontSize() {
return mFontSize;
}
// Returns a line height which takes into account the requested line height
// and the height of the inline images.
public float getEffectiveLineHeight() {
@@ -464,6 +473,12 @@ public class ReactTextShadowNode extends LayoutShadowNode {
}
}
@ReactProp(name = ViewProps.LETTER_SPACING, defaultFloat = UNSET)
public void setLetterSpacing(float letterSpacing) {
mLetterSpacing = letterSpacing == UNSET ? Float.NaN : letterSpacing;
markUpdated();
}
@ReactProp(name = ViewProps.TEXT_ALIGN)
public void setTextAlign(@Nullable String textAlign) {
if (textAlign == null || "auto".equals(textAlign)) {
@@ -653,6 +668,8 @@ public class ReactTextShadowNode extends LayoutShadowNode {
getPadding(Spacing.TOP),
getPadding(Spacing.END),
getPadding(Spacing.BOTTOM),
getLetterSpacing(),
getFontSize(),
getTextAlign(),
mTextBreakStrategy
);
@@ -26,6 +26,8 @@ public class ReactTextUpdate {
private final float mPaddingTop;
private final float mPaddingRight;
private final float mPaddingBottom;
private final float mLetterSpacing;
private final int mFontSize;
private final int mTextAlign;
private final int mTextBreakStrategy;
@@ -62,6 +64,8 @@ public class ReactTextUpdate {
float paddingTop,
float paddingEnd,
float paddingBottom,
float letterSpacing,
int fontSize,
int textAlign,
int textBreakStrategy) {
mText = text;
@@ -71,6 +75,8 @@ public class ReactTextUpdate {
mPaddingTop = paddingTop;
mPaddingRight = paddingEnd;
mPaddingBottom = paddingBottom;
mLetterSpacing = letterSpacing;
mFontSize = fontSize;
mTextAlign = textAlign;
mTextBreakStrategy = textBreakStrategy;
}
@@ -103,6 +109,14 @@ public class ReactTextUpdate {
return mPaddingBottom;
}
public float getLetterSpacing() {
return mLetterSpacing;
}
public int getFontSize() {
return mFontSize;
}
public int getTextAlign() {
return mTextAlign;
}
@@ -23,6 +23,8 @@ import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.TextView;
import com.facebook.csslayout.FloatUtil;
import com.facebook.react.uimanager.PixelUtil;
import com.facebook.react.uimanager.ReactCompoundView;
import com.facebook.react.uimanager.ViewDefaults;
import com.facebook.react.views.view.ReactViewBackgroundDrawable;
@@ -37,6 +39,7 @@ public class ReactTextView extends TextView implements ReactCompoundView {
private int mDefaultGravityVertical;
private boolean mTextIsSelectable;
private float mLineHeight = Float.NaN;
private float mLetterSpacing = Float.NaN;
private int mTextAlign = Gravity.NO_GRAVITY;
private int mNumberOfLines = ViewDefaults.NUMBER_OF_LINES;
private TextUtils.TruncateAt mEllipsizeLocation = TextUtils.TruncateAt.END;
@@ -65,6 +68,21 @@ public class ReactTextView extends TextView implements ReactCompoundView {
(int) Math.floor(update.getPaddingRight()),
(int) Math.floor(update.getPaddingBottom()));
// API 21+: https://developer.android.com/reference/android/widget/TextView.html#setLetterSpacing(float)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
float nextLetterSpacing = update.getLetterSpacing();
int fontSize = update.getFontSize();
if (!FloatUtil.floatsEqual(mLetterSpacing, nextLetterSpacing)) {
mLetterSpacing = nextLetterSpacing;
if(Float.isNaN(mLetterSpacing)) {
setLetterSpacing((float)0.0);
} else {
//calculate EM from proper font pixels
setLetterSpacing(1+(mLetterSpacing-PixelUtil.toDIPFromPixel(fontSize))/PixelUtil.toDIPFromPixel(fontSize));
}
}
}
int nextTextAlign = update.getTextAlign();
if (mTextAlign != nextTextAlign) {
mTextAlign = nextTextAlign;
@@ -103,6 +103,11 @@ public class ReactTextInputShadowNode extends ReactTextShadowNode implements
(int) Math.floor(getPadding(Spacing.END)),
(int) Math.floor(getPadding(Spacing.BOTTOM)));
// API 21+: https://developer.android.com/reference/android/widget/TextView.html#setLetterSpacing(float)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
editText.setLetterSpacing(getLetterSpacing());
}
if (mNumberOfLines != UNSET) {
editText.setLines(mNumberOfLines);
}
@@ -176,6 +181,8 @@ public class ReactTextInputShadowNode extends ReactTextShadowNode implements
getPadding(Spacing.TOP),
getPadding(Spacing.END),
getPadding(Spacing.BOTTOM),
getLetterSpacing(),
getFontSize(),
mTextAlign,
mTextBreakStrategy
);