mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Merge pull request #13 from airbnb/al/0.41-linespacing
Enable linespacing for versions >= Lollipop (5.0)
This commit is contained in:
@@ -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;
|
||||
|
||||
+7
@@ -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
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user