blob: 74fb9e3acb22c311697bc958c917f8a2be316c5c [file] [log] [blame]
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.ui.text.demos
import androidx.compose.Composable
import androidx.ui.core.Span
import androidx.ui.core.Text
import androidx.ui.core.px
import androidx.ui.engine.geometry.Offset
import androidx.ui.text.font.FontStyle
import androidx.ui.text.font.FontWeight
import androidx.ui.text.style.TextAlign
import androidx.ui.text.font.FontFamily
import androidx.ui.graphics.Color
import androidx.ui.graphics.lerp
import androidx.ui.layout.Column
import androidx.ui.layout.Row
import androidx.ui.foundation.VerticalScroller
import androidx.ui.text.ParagraphStyle
import androidx.ui.graphics.Shadow
import androidx.ui.text.TextStyle
import androidx.ui.text.style.TextOverflow
import androidx.ui.core.em
import androidx.ui.core.sp
import androidx.ui.layout.ExpandedHeight
import androidx.ui.layout.ExpandedWidth
import androidx.ui.text.LocaleList
import androidx.ui.text.samples.BaselineShiftSample
import androidx.ui.text.samples.FontFamilyCursiveSample
import androidx.ui.text.samples.FontFamilyMonospaceSample
import androidx.ui.text.samples.FontFamilySansSerifSample
import androidx.ui.text.samples.FontFamilySerifSample
import androidx.ui.text.samples.ParagraphStyleAnnotatedStringsSample
import androidx.ui.text.samples.ParagraphStyleSample
import androidx.ui.text.samples.TextDecorationCombinedSample
import androidx.ui.text.samples.TextDecorationLineThroughSample
import androidx.ui.text.samples.TextDecorationUnderlineSample
import androidx.ui.text.samples.TextStyleSample
val displayText = "Text Demo"
val displayTextChinese = "文本演示"
val displayTextArabic = "عرض النص"
val displayTextHindi = "पाठ डेमो"
val fontSize4 = 16.sp
val fontSize6 = 20.sp
val fontSize8 = 25.sp
val fontSize10 = 30.sp
@Composable
fun TextDemo() {
VerticalScroller {
Column {
TagLine(tag = "color, fontSize, fontWeight and fontStyle")
TextDemoBasic()
TagLine(tag = "color, fontSize, fontWeight, fontFamily, fontStyle, letterSpacing, " +
"background, decoration")
TextDemoComplexStyling()
TagLine(tag = "Chinese, Arabic, and Hindi")
TextDemoLanguage()
TagLine(tag = "FontFamily generic names")
TextDemoFontFamily()
TagLine(tag = "FontFamily default values")
TextDemoFontFamilyDefaultValues()
TagLine(tag = "decoration, decorationColor and decorationStyle")
TextDemoTextDecoration()
TagLine(tag = "letterSpacing")
TextDemoLetterSpacing()
TagLine(tag = "baselineShift")
TextDemoBaselineShift()
TagLine(tag = "lineHeight")
TextDemoHeight()
TagLine(tag = "background")
TextDemoBackground()
TagLine(tag = "Locale: Japanese, Simplified and Traditional Chinese")
TextDemoLocale()
TagLine(tag = "textAlign and textDirection")
TextDemoTextAlign()
TagLine(tag = "softWrap: on and off")
TextDemoSoftWrap()
TagLine(tag = "TextOverFlow: Fade")
TexDemoTextOverflowFade()
TagLine(tag = "shadow")
TextDemoShadowEffect()
TagLine(tag = "composable textspan")
TextDemoComposableTextSpan()
TagLine(tag = "fontSizeScale")
TextDemoFontSizeScale()
TagLine(tag = "complex paragraph styling")
TextDemoParagraphStyling()
}
}
}
@Composable
fun TagLine(tag: String) {
Text {
Span(text = "\n", style = TextStyle(fontSize = fontSize8))
Span(
text = tag,
style = TextStyle(
color = Color(0xFFAAAAAA),
fontSize = fontSize6
)
)
}
}
@Composable
fun SecondTagLine(tag: String) {
Text {
Span(
text = tag,
style = TextStyle(
color = Color(0xFFAAAAAA),
fontSize = fontSize4
)
)
}
}
@Composable
fun TextDemoBasic() {
// This group of text composables show different color, fontSize, fontWeight and fontStyle in
// English.
Text {
Span(
text = "$displayText ",
style = TextStyle(
color = Color(0xFFFF0000),
fontSize = fontSize6,
fontWeight = FontWeight.W200,
fontStyle = FontStyle.Italic
)
)
Span(
text = "$displayText ",
style = TextStyle(
color = Color(0xFF00FF00),
fontSize = fontSize8,
fontWeight = FontWeight.W500,
fontStyle = FontStyle.Normal
)
)
Span(
text = displayText,
style = TextStyle(
color = Color(0xFF0000FF),
fontSize = fontSize10,
fontWeight = FontWeight.W800,
fontStyle = FontStyle.Normal
)
)
}
}
@Composable
fun TextDemoComplexStyling() {
TextStyleSample()
}
@Composable
fun TextDemoLanguage() {
// This group of text composables show different color, fontSize, fontWeight and fontStyle in
// Chinese, Arabic, and Hindi.
Text {
Span(
text = "$displayTextChinese ",
style = TextStyle(
color = Color(0xFFFF0000),
fontSize = fontSize6,
fontWeight = FontWeight.W200,
fontStyle = FontStyle.Italic
)
)
Span(
text = "$displayTextArabic ",
style = TextStyle(
color = Color(0xFF00FF00),
fontSize = fontSize8,
fontWeight = FontWeight.W500,
fontStyle = FontStyle.Normal
)
)
Span(
text = displayTextHindi,
style = TextStyle(
color = Color(0xFF0000FF),
fontSize = fontSize10,
fontWeight = FontWeight.W800,
fontStyle = FontStyle.Normal
)
)
}
}
@Composable
fun TextDemoFontFamily() {
// This group of text composables show different fontFamilies in English.
Text {
Span(
text = "$displayText sans-serif\n", style = TextStyle(
fontSize = fontSize8,
fontFamily = FontFamily("sans-serif")
)
)
Span(
text = "$displayText serif\n", style = TextStyle(
fontSize = fontSize8,
fontFamily = FontFamily("serif")
)
)
Span(
text = "$displayText monospace", style = TextStyle(
fontSize = fontSize8,
fontFamily = FontFamily("monospace")
)
)
}
}
@Composable
fun TextDemoFontFamilyDefaultValues() {
// This group of text composables show the default font families in English.
FontFamilySerifSample()
FontFamilySansSerifSample()
FontFamilyMonospaceSample()
FontFamilyCursiveSample()
}
@Composable
fun TextDemoTextDecoration() {
// This group of text composables show different decoration, decorationColor and decorationStyle.
TextDecorationLineThroughSample()
TextDecorationUnderlineSample()
TextDecorationCombinedSample()
}
@Composable
fun TextDemoLetterSpacing() {
// This group of text composables show different letterSpacing.
Text {
Span(text = "$displayText ", style = TextStyle(fontSize = fontSize8))
Span(
text = displayText,
style = TextStyle(
fontSize = fontSize8,
letterSpacing = 0.5.em
)
)
}
}
@Composable
fun TextDemoBaselineShift() {
BaselineShiftSample()
}
@Composable
fun TextDemoHeight() {
// This group of text composables show different height.
Row(ExpandedWidth) {
Text {
Span(
text = "$displayText\n$displayText ",
style = TextStyle(fontSize = fontSize8)
)
}
Text(
paragraphStyle = ParagraphStyle(lineHeight = 50.sp)
) {
Span(
text = "$displayText\n$displayText ",
style = TextStyle(
fontSize = fontSize8
)
)
}
}
}
@Composable
fun TextDemoBackground() {
// This group of text composables show different background.
Text {
Span(
text = "$displayText ",
style = TextStyle(
fontSize = fontSize8,
background = Color(0xFFFF0000)
)
)
Span(
text = "$displayText ",
style = TextStyle(
fontSize = fontSize8,
background = Color(0xFF00FF00)
)
)
Span(
text = displayText,
style = TextStyle(
fontSize = fontSize8,
background = Color(0xFF0000FF)
)
)
}
}
@Composable
fun TextDemoLocale() {
// This group of text composables show different Locales of the same Unicode codepoint.
val text = "\u82B1"
Text {
Span(
text = "$text ",
style = TextStyle(
fontSize = fontSize8,
localeList = LocaleList("ja-JP")
)
)
Span(
text = "$text ",
style = TextStyle(
fontSize = fontSize8,
localeList = LocaleList("zh-CN")
)
)
Span(
text = text,
style = TextStyle(
fontSize = fontSize8,
localeList = LocaleList("zh-TW")
)
)
}
}
@Composable
fun TextDemoTextAlign() {
// This group of text composables show different TextAligns: LEFT, RIGHT, CENTER, JUSTIFY, START for
// LTR and RTL, END for LTR and RTL.
var text = ""
for (i in 1..10) {
text = "$text$displayText "
}
Column(ExpandedHeight) {
SecondTagLine(tag = "textAlign = TextAlign.Left")
Text(paragraphStyle = ParagraphStyle(textAlign = TextAlign.Left)) {
Span(text = displayText, style = TextStyle(fontSize = fontSize8))
}
SecondTagLine(tag = "textAlign = TextAlign.Right")
Text(paragraphStyle = ParagraphStyle(textAlign = TextAlign.Right)) {
Span(text = displayText, style = TextStyle(fontSize = fontSize8))
}
SecondTagLine(tag = "textAlign = TextAlign.Center")
Text(paragraphStyle = ParagraphStyle(textAlign = TextAlign.Center)) {
Span(text = displayText, style = TextStyle(fontSize = fontSize8))
}
SecondTagLine(tag = "textAlign = default and TextAlign.Justify")
Text {
Span(
text = text,
style = TextStyle(
fontSize = fontSize8,
color = Color(0xFFFF0000)
)
)
}
Text(paragraphStyle = ParagraphStyle(textAlign = TextAlign.Justify)) {
Span(
text = text,
style = TextStyle(
fontSize = fontSize8,
color = Color(0xFF0000FF)
)
)
}
SecondTagLine(tag = "textAlgin = TextAlign.Start for Ltr")
Text(paragraphStyle = ParagraphStyle(textAlign = TextAlign.Start)) {
Span(text = displayText, style = TextStyle(fontSize = fontSize8))
}
SecondTagLine(tag = "textAlgin = TextAlign.Start for Rtl")
Text(
paragraphStyle = ParagraphStyle(
textAlign = TextAlign.Start
)
) {
Span(text = displayText, style = TextStyle(fontSize = fontSize8))
}
SecondTagLine(tag = "textAlgin = TextAlign.End for Ltr")
Text(paragraphStyle = ParagraphStyle(textAlign = TextAlign.End)) {
Span(text = displayText, style = TextStyle(fontSize = fontSize8))
}
SecondTagLine(tag = "textAlgin = TextAlign.End for Rtl")
Text(
paragraphStyle = ParagraphStyle(
textAlign = TextAlign.End
)
) {
Span(text = displayText, style = TextStyle(fontSize = fontSize8))
}
}
}
@Composable
fun TextDemoSoftWrap() {
// This group of text composables show difference between softWrap is true and false.
var text = ""
for (i in 1..10) {
text = "$text$displayText"
}
val textStyle =
TextStyle(fontSize = fontSize8, color = Color(0xFFFF0000))
Column(ExpandedHeight) {
Text {
Span(text = text, style = textStyle)
}
Text(softWrap = false) {
Span(text = text, style = textStyle)
}
}
}
@Composable
fun TexDemoTextOverflowFade() {
var text = ""
for (i in 1..15) {
text += displayText
}
val textSytle =
TextStyle(fontSize = fontSize8, color = Color(0xFFFF0000))
SecondTagLine(tag = "horizontally fading edge")
Text(
maxLines = 1,
overflow = TextOverflow.Fade,
softWrap = false
) {
Span(text = text, style = textSytle)
}
SecondTagLine(tag = "vertically fading edge")
Text(
maxLines = 3,
overflow = TextOverflow.Fade
) {
Span(text = text, style = textSytle)
}
}
@Composable
fun TextDemoShadowEffect() {
val shadow = Shadow(
Color(0xFFE0A0A0),
Offset(5f, 5f),
blurRadius = 5.px
)
Text {
Span(text = "text with ", style = TextStyle(fontSize = fontSize8)) {
Span(text = "shadow!", style = TextStyle(shadow = shadow))
}
}
}
@Composable
fun TextDemoComposableTextSpan() {
Text(style = TextStyle(fontSize = fontSize8)) {
Span(text = "This is a ")
Span(text = "composable ", style = TextStyle(fontStyle = FontStyle.Italic))
val color1 = Color(0xFFEF50AD)
val color2 = Color(0xFF10AF52)
val text = "TextSpan"
text.forEachIndexed { index, ch ->
val color = lerp(color1, color2, index.toFloat() / text.lastIndex)
Span(text = "$ch", style = TextStyle(color = color))
}
}
}
@Composable
fun TextDemoFontSizeScale() {
Text {
Span(style = TextStyle(fontSize = fontSize8)) {
for (i in 4..12 step 4) {
val scale = i * 0.1f
Span("fontSizeScale=$scale\n", style = TextStyle(fontSize = scale.em))
}
}
}
}
@Composable
fun TextDemoParagraphStyling() {
ParagraphStyleSample()
ParagraphStyleAnnotatedStringsSample()
}