Skip to content

Commit e997cb5

Browse files
Add initial pointerInput sample
1 parent 6aa96a6 commit e997cb5

File tree

4 files changed

+148
-20
lines changed

4 files changed

+148
-20
lines changed

Tutorial1-1Basics/src/main/java/com/smarttoolfactory/tutorial1_1basics/chapter5_gesture/Tutorial5_1Clickable.kt

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ private fun DiscreteInteractionSourceExample() {
410410
}
411411

412412
Toast
413-
.makeText(context, "First one clicked", Toast.LENGTH_SHORT)
413+
.makeText(context, "Outer one is clicked", Toast.LENGTH_SHORT)
414414
.show()
415415

416416
}
@@ -431,7 +431,7 @@ private fun DiscreteInteractionSourceExample() {
431431
indication = rememberRipple(),
432432
onClick = {
433433
Toast
434-
.makeText(context, "🔥 Second one clicked", Toast.LENGTH_SHORT)
434+
.makeText(context, "🔥 Inner one is clicked", Toast.LENGTH_SHORT)
435435
.show()
436436
}
437437
)
@@ -493,6 +493,7 @@ private fun DiscreteInteractionSourceFLowExample() {
493493
block = {
494494
interactionSourceSentRow.interactions
495495
.onEach { interaction: Interaction ->
496+
// Quote emits same interaction row had when row is clicked or released
496497
interactionSourceSentQuote.emit(interaction)
497498
}
498499
.launchIn(this)
@@ -502,6 +503,7 @@ private fun DiscreteInteractionSourceFLowExample() {
502503
Column(
503504
modifier = Modifier
504505
.fillMaxWidth()
506+
.background(Color.LightGray)
505507
.padding(8.dp)
506508
) {
507509
SubcomposeColumn(
@@ -569,7 +571,12 @@ private fun DiscreteInteractionSourceFLowExample() {
569571
)
570572

571573

572-
Column(modifier = Modifier.fillMaxWidth().padding(8.dp)) {
574+
Column(
575+
modifier = Modifier
576+
.fillMaxWidth()
577+
.background(Color.LightGray)
578+
.padding(8.dp)
579+
) {
573580
// This is chat bubble
574581
SubcomposeColumn(
575582
modifier = Modifier
@@ -588,24 +595,24 @@ private fun DiscreteInteractionSourceFLowExample() {
588595
altName = recipientOriginalName
589596
)
590597

591-
// 💬 Quoted message
592-
QuotedMessageAlt(
593-
modifier = Modifier
594-
.padding(top = 4.dp, start = 4.dp, end = 4.dp)
595-
// 🔥 This is required to set Surface height before text is set
596-
.height(IntrinsicSize.Min)
597-
.background(ReceivedQuoteColor, shape = RoundedCornerShape(8.dp))
598-
.clip(shape = RoundedCornerShape(8.dp))
599-
.clickable(
600-
interactionSource = interactionSourceReceivedQuote,
601-
indication = rememberRipple(),
602-
onClick = {}
603-
),
604-
quotedMessage = "quotedMessage",
605-
)
598+
// 💬 Quoted message
599+
QuotedMessageAlt(
600+
modifier = Modifier
601+
.padding(top = 4.dp, start = 4.dp, end = 4.dp)
602+
// 🔥 This is required to set Surface height before text is set
603+
.height(IntrinsicSize.Min)
604+
.background(ReceivedQuoteColor, shape = RoundedCornerShape(8.dp))
605+
.clip(shape = RoundedCornerShape(8.dp))
606+
.clickable(
607+
interactionSource = interactionSourceReceivedQuote,
608+
indication = rememberRipple(),
609+
onClick = {}
610+
),
611+
quotedMessage = "quotedMessage",
612+
)
606613

607614
ChatFlexBoxLayout(
608-
modifier = Modifier.padding(start = 2.dp, end = 4.dp),
615+
modifier = Modifier.padding(start = 2.dp, end = 4.dp),
609616
text = "Message",
610617
messageStat = {
611618
CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package com.smarttoolfactory.tutorial1_1basics.chapter5_gesture
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.gestures.detectTapGestures
5+
import androidx.compose.foundation.layout.*
6+
import androidx.compose.foundation.rememberScrollState
7+
import androidx.compose.foundation.shape.RoundedCornerShape
8+
import androidx.compose.foundation.verticalScroll
9+
import androidx.compose.material.Text
10+
import androidx.compose.runtime.*
11+
import androidx.compose.ui.Alignment
12+
import androidx.compose.ui.Modifier
13+
import androidx.compose.ui.draw.shadow
14+
import androidx.compose.ui.graphics.Color
15+
import androidx.compose.ui.input.pointer.pointerInput
16+
import androidx.compose.ui.text.style.TextAlign
17+
import androidx.compose.ui.unit.dp
18+
import com.smarttoolfactory.tutorial1_1basics.chapter4_state.blue400
19+
import com.smarttoolfactory.tutorial1_1basics.chapter4_state.green400
20+
import com.smarttoolfactory.tutorial1_1basics.chapter4_state.orange400
21+
import com.smarttoolfactory.tutorial1_1basics.chapter4_state.pink400
22+
import com.smarttoolfactory.tutorial1_1basics.ui.components.StyleableTutorialText
23+
24+
@Composable
25+
fun Tutorial5_2Screen() {
26+
TutorialContent()
27+
}
28+
29+
@Composable
30+
private fun TutorialContent() {
31+
32+
Column(
33+
modifier = Modifier
34+
.fillMaxSize()
35+
.verticalScroll(rememberScrollState())
36+
) {
37+
StyleableTutorialText(
38+
text = "1-) Detects tap, double-tap, and long press gestures and calls onTap, " +
39+
"onDoubleTap, and onLongPress, respectively, when detected. "
40+
)
41+
DetectTapGesturesExample()
42+
}
43+
44+
}
45+
46+
private val modifier = Modifier
47+
.padding(8.dp)
48+
.fillMaxWidth()
49+
.height(40.dp)
50+
.shadow(elevation = 2.dp, shape = RoundedCornerShape(16.dp), clip = true)
51+
52+
@Composable
53+
private fun DetectTapGesturesExample() {
54+
55+
var gestureText by remember { mutableStateOf("Idle") }
56+
var gestureColor by remember { mutableStateOf(Color(0xffBDBDBD)) }
57+
58+
modifier
59+
.background(gestureColor, shape = RoundedCornerShape(16.dp))
60+
.pointerInput(Unit) {
61+
detectTapGestures(
62+
onPress = {
63+
gestureText = "onPress"
64+
gestureColor = orange400
65+
},
66+
onTap = {
67+
gestureText = "onTap offset: $it"
68+
gestureColor = pink400
69+
},
70+
onDoubleTap = {
71+
gestureText = "onDoubleTap offset: $it"
72+
gestureColor = blue400
73+
74+
},
75+
onLongPress = {
76+
gestureText = "onLongPress offset: $it"
77+
gestureColor = green400
78+
}
79+
)
80+
}
81+
82+
Box(
83+
contentAlignment = Alignment.Center,
84+
modifier = modifier
85+
) {
86+
Text(
87+
text = gestureText,
88+
color = Color.White,
89+
textAlign = TextAlign.Center
90+
)
91+
}
92+
}

Tutorial1-1Basics/src/main/java/com/smarttoolfactory/tutorial1_1basics/tutorial_list/Tags.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,3 +142,11 @@ const val TAG_CLICKABLE = "clickable"
142142
const val TAG_INDICATION = "Indication"
143143
const val TAG_REMEMBER_RIPPLE = "rememberRipple"
144144
const val TAG_INTERACTION_SOURCE = "InteractionSource"
145+
const val TAG_POINTER_INPUT = "pointerInput"
146+
const val TAG_DETECT_TAP_GESTURES = "detectTapGestures"
147+
const val TAG_DETECT_DRAG_GESTURES = "detectTapGestures"
148+
const val TAG_ON_PRESS = "onPress"
149+
const val TAG_ON_DOUBLE_TAP = "onDoubleTap"
150+
const val TAG_ON_LONG_PRESS= "onLongPress"
151+
const val TAG_ON_TAP= "onTap"
152+

Tutorial1-1Basics/src/main/java/com/smarttoolfactory/tutorial1_1basics/tutorial_list/TutorialList.kt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.smarttoolfactory.tutorial1_1basics.chapter2_material_widgets.*
1414
import com.smarttoolfactory.tutorial1_1basics.chapter3_layout.*
1515
import com.smarttoolfactory.tutorial1_1basics.chapter4_state.*
1616
import com.smarttoolfactory.tutorial1_1basics.chapter5_gesture.Tutorial5_1Screen
17+
import com.smarttoolfactory.tutorial1_1basics.chapter5_gesture.Tutorial5_2Screen
1718
import com.smarttoolfactory.tutorial1_1basics.model.TutorialSectionModel
1819
import com.smarttoolfactory.tutorial1_1basics.ui.GestureListColor
1920
import com.smarttoolfactory.tutorial1_1basics.ui.LayoutListColor
@@ -767,7 +768,7 @@ fun createGestureTutorialList(): List<TutorialSectionModel> {
767768

768769
val tutorial5_1 = TutorialSectionModel(
769770
title = stringResource(R.string.title_5_1),
770-
description = "Tutorial about clickable modifier, Indication and InteractionSource",
771+
description = "Tutorial about clickable modifier, Indication and InteractionSource.",
771772
action = {
772773
Tutorial5_1Screen()
773774
},
@@ -781,7 +782,27 @@ fun createGestureTutorialList(): List<TutorialSectionModel> {
781782
tagColor = GestureListColor
782783
)
783784

785+
val tutorial5_2 = TutorialSectionModel(
786+
title = "PointerInput",
787+
description = "Tutorial about PointerInput, press, tap, long press and other gestures.",
788+
action = {
789+
Tutorial5_2Screen()
790+
},
791+
tags = listOf(
792+
TAG_COMPOSE,
793+
TAG_POINTER_INPUT,
794+
TAG_DETECT_TAP_GESTURES,
795+
TAG_DETECT_DRAG_GESTURES,
796+
TAG_ON_PRESS,
797+
TAG_ON_DOUBLE_TAP,
798+
TAG_ON_LONG_PRESS,
799+
TAG_ON_TAP
800+
),
801+
tagColor = GestureListColor
802+
)
803+
784804
return listOf(
785805
tutorial5_1,
806+
tutorial5_2
786807
)
787808
}

0 commit comments

Comments
 (0)