ãã®è¨äºã¯ BASE ã¢ããã³ãã«ã¬ã³ãã¼ 17æ¥ç®ã®è¨äºã§ãã
ã¯ããã«
Pay IDã¢ããªãã¼ã ã®å°æã§ãããã·ã§ããã³ã°ã¢ã㪠Pay IDãã®Androidã¢ããªãéçºãã¦ãã¾ãã
ä»åã¯Jetpack Composeã§ConstraintLayoutã使ã£ãäºä¾ç´¹ä»ããããã¨æãã¾ãã
ConstraintLayoutã¨ã¯
ã¾ããConstraintLayoutã¨ã¯ãè¤éãªã¬ã¤ã¢ã¦ããç¹ã«ç¸å¯¾çãªã¬ã¤ã¢ã¦ããæ¸ãããã¨ãã«ä½¿ããã¨ã«ãªãã¯ã©ã¹ã§ãã
å§ã¾ãã¯Composeã«ããã¬ã¤ã¢ã¦ã使ã®åãXMLã«ã¦ã¬ã¤ã¢ã¦ããæ¸ãã¦ããé ã«ç»å ´ãã¾ããã
ãã®é ã¯XMLã ã£ãã®ã§ãè¤éãªã¬ã¤ã¢ã¦ãã¯ãã¹ããã¦æ¸ããªããã°ãªãããåããã¥ãããã®ã«ãªã£ã¦ãã¾ããã
ã¾ãããã¹ãããã¬ã¤ã¢ã¦ãã¯ããã©ã¼ãã³ã¹ä¸ã®åé¡ãããã¾ããã
ãã©ããã«ãã¹ããªãæ¸ããããã«ãªãConstraintLayoutã¯ãè¨å®ã®ã¨ã£ã¤ãã¥ããã¯ãã£ããã®ã®ããã¹ãã«ããåããã¥ããã«æ¯ã¹ããæå¹ãªLayoutã ã£ãã¨æãã¦ãã¾ãã
ConstraintLayoutã ãã§ä½¿ããã¬ã¤ã¢ã¦ã表ç¾ãããã¾ããã
ãã®å¾ãComposeãèªçãKotlinã³ã¼ãã§ã¬ã¤ã¢ã¦ããæ¸ããã¨ãå¯è½ã«ãªãã¾ããã
ãã¹ãã«ããåããã¥ããã¯ã¡ã½ããåãçã®Kotlinã³ã¼ãã§æ¸ããã¨ã§ã§ããææ³ã§ããç¨åº¦è§£æ¶ãããã¨ãã§ããããã©ã¼ãã³ã¹åé¡ãComposeã¯ãã¹ããã¦ãæªåããªãããã«ãªãã¾ããã
注: View ã·ã¹ãã ã§ã¯ãå¤§è¦æ¨¡ã§è¤éãªã¬ã¤ã¢ã¦ãã使ããå ´åã ConstraintLayout ã使ç¨ãããã¨ãæ¨å¥¨ããã¦ãã¾ããã ããã¯ããã¹ãããããã¥ã¼ããããã©ãããªãã¥ã¼éå±¤ã®æ¹ã ããã©ã¼ãã³ã¹ã«åªãã¦ããããã§ãã ããããæ·±ãã¬ã¤ã¢ã¦ãé層ãå¹ççã«æ±ãã Compose ã§ã¯ã ãã®ãããªæ¸å¿µã¯ããã¾ããã
( https://developer.android.com/develop/ui/compose/layouts/constraintlayout?hl=ja ãã転è¼)
åè¿°ããConstraintLayoutã ãã§ä½¿ãã表ç¾ããRowãColumnçã§ã表ç¾ã§ããããã«ãªã£ããã¨ãConstraintLayoutã使ããªããã°ãªããªãé¨åã¯å¤§ããæ¸ãã¾ããã
(ä¾: ã¬ã¤ãã©ã¤ã³ã¨ããè¡¨ç¾æ¹æ³ã®å ´å)
注: Rows 㨠Columns ã§åæ§ã®å¹æãå®ç¾ããã«ã¯ãSpacer ã®ä½¿ç¨ããæ¤è¨ãã ããã
( https://developer.android.com/develop/ui/compose/layouts/constraintlayout?hl=ja#guidelines ãã転è¼)
Composeã§ConstraintLayoutã使ã£ãã±ã¼ã¹
ãã®ãããæ®æ®µã¯Composeã§ConstraintLayoutã使ããªãã®ã§ãããPay IDã¢ããªã§è¡¨ç¾ãããã¬ã¤ã¢ã¦ããå®ç¾ããããã«ConstraintLayoutã使ã£ã¦ããç®æãããã¤ãããã¾ãã
1ã¤ã®Viewã«åããã¦ãç¸¦ã¨æ¨ªã®ã©ã¤ã³ãæãããå ´å
ãã®ã¾ã¾ãConstraintLayoutã®ç¨éã§ããç¸å¯¾çãªã¬ã¤ã¢ã¦ããä½ãããã£ãå ´åã§ãã
ãã®ãããªã¬ã¤ã¢ã¦ããããããã§ãã¯ã¢ã¤ã³ã³ã®ä¸å¤®ã©ã¤ã³ã«æ¥ä»ãã©ãã«ãæãããã®ã¨ãã§ãã¯ã¢ã¤ã³ã³ã®ä¸ä¸ã«ããç·ãç°è²ã®æ£UIãããã§ãã¯ã¢ã¤ã³ã³ã®ç¸¦çãä¸ã«æããããã®ã§ããã
ããããã³ã¼ãã«èµ·ããã¦ããã®ããã¡ãã§ãã
ConstraintLayout( modifier = Modifier.fillMaxWidth(), ) { val ( topLine, checkicon, bottomLine, dateRef, // ... ä»ã¬ã¤ã¢ã¦ãã®å¶ç´å ) = createRefs() LowerHalfBar(// æ£ã®ä¸åå modifier = Modifier.constrainAs(topLine) { start.linkTo(checkicon.start) end.linkTo(checkicon.end) top.linkTo(parent.top) }, viewData = viewData, ) CheckBoxPaid(// ãã§ãã¯ã¢ã¤ã³ã³ modifier = Modifier.constrainAs(checkicon) { start.linkTo(parent.start, margin = 16.dp) top.linkTo(parent.top, margin = 16.dp) bottom.linkTo(parent.bottom, margin = 16.dp) }, viewData = viewData, ) UpperHalfBar(// æ£ã®ä¸åå modifier = Modifier.constrainAs(bottomLine) { start.linkTo(checkicon.start) end.linkTo(checkicon.end) bottom.linkTo(parent.bottom) }, viewData = viewData, ) Date(// æ¥ä» modifier = Modifier.constrainAs(dateRef) { start.linkTo(checkicon.end, margin = 16.dp) top.linkTo(checkicon.top) bottom.linkTo(checkicon.bottom) }, viewData = viewData, ) // ...ä»ã¬ã¤ã¢ã¦ã }
ConstraintLayoutèªä½ã®æ¸ãæ¹ã®èª¬æã¯å ¬å¼ã®èª¬æã詳ããããããããã®ã§çç¥ãã¾ãããåã¬ã¤ã¢ã¦ãã®linkToã«ãã§ãã¯ã¢ã¤ã³ã³ã®ä¸ä¸ãstart/endãè¨å®ãããã¨ã§ããã§ãã¯ã¢ã¤ã³ã³ã«å¯¾ãã¦ã®ä¸å¤®ã«åã¬ã¤ã¢ã¦ããé ç½®ãããã¨ãã§ãã¦ãã¾ãã
BoxãRow/Columnã使ã£ã¦è¡¨ç¾ãããã¨ããã®ã§ããã
- ãã§ãã¯ã¢ã¤ã³ã³ï¼æ¥ä»çãRowã§å²ãã§ä¸ä¸ã®æ£ãå·¦å¯ãã§ã¢ã¤ã³ã³ã®ä¸å¤®ã£ã½ãããã¨ãã¹ã¯ãªã¼ã³è¨å®çã§ãºã¬ã
- ãã§ãã¯ã¢ã¤ã³ã³ï¼ä¸ä¸ã®æ£ãColumnã§å²ãã§ãæ¥ä»ããããã®ä¸å¤®ã«æå®ããã¨ãå¾®å¦ã«ã¢ã¤ã³ã³ã®ä¸å¤®ããã¯ãºã¬ã¦ãã¾ãããä¸ä¸ã®æ£ãã¤ãªãã£ã¦è¦ããªã
ã¨ããåé¡ããã£ãããã¦ãConstraintLayoutã使ããã¨ã§è§£æ±ºãã¾ããã
ã¬ã¤ã¢ã¦ããéãããå ´å
ï¼ã¤ç®ã¯UIãéãã¦è¡¨ç¾ãããã¨ãã§ãã
ãã¡ãã®ã¬ã¤ã¢ã¦ããªã®ã§ãã
ã®2ã¤ã®ã¬ã¤ã¢ã¦ãã®å¾ãã«ãç½èæ¯ã®Spacerãéãã¦è¡¨ç¾ãã¦ãã¾ãã
ConstraintLayout { val (text1, image2, background3) = createRefs() Spacer( // ç½èæ¯ãéãããå ã«å®ç¾©ãã modifier = Modifier .background(Color.White) .constrainAs(background3) { top.linkTo(text1.top)// ããã¹ãã¨åãé«ãã«ãã bottom.linkTo(text1.bottom)// ããã¹ãã¨åãé«ãã«ãã start.linkTo(text1.start, 24.dp) // ããã¹ãã®å°ãå³å´ãã end.linkTo(image2.end, 12.dp) // ç»åã®å°ãå·¦å´ã¾ã§è¡¨ç¤ºãã width = Dimension.fillToConstraints height = Dimension.fillToConstraints }, ) Text( modifier = Modifier //...ç¥ .constrainAs(text1) { top.linkTo(image2.top) //ç»åã¨ã®ä¸å¤®æãã®è¨å® bottom.linkTo(image2.bottom)//ç»åã¨ã®ä¸å¤®æãã®è¨å® start.linkTo(parent.start) end.linkTo(image.start)// ç»åã®å·¦ã«é ç½® }, text = "æè¿ã®è³¼å ¥å", ) Image( modifier = Modifier // ...ç¥ .constrainAs(image2) { end.linkTo(parent.end) }, painter = //..., contentDescription = "ç»å", ) } }
ãã®ããã«ãããã¨ã§ããã¹ãã¨ç»åã®éã®å¾®å¦ãªééãç½èæ¯ã§åãããã¨ãã§ãã¾ãã
Spacerã¯ä½ãå®ç¾©ããªãã¨0dpã§linkToã§å¹ ãé«ããè¨å®ãã¦ãæç»ããã¾ããã
ãã®ãããwidth/heightã§Dimension.fillToConstraintsãè¨å®ãããã¨ã§ãconstrainAsã§è¨å®ãããã®UIã表示ããã¦ããé åãã£ã±ãã¾ã§é«ããå¹ ãåºãã¦ããã¾ãã
ãããã«
ä»åã¯Pay IDã¢ããªã§Jetpack Composeä¸ã§ConstraintLayoutã使ã£ã¦ããäºä¾ã2ã¤ç´¹ä»ãã¾ããã
ããã¾ã§è¦ã¦ããã ããæ¹ã®å©ãã«ãªã£ãã幸ãã§ãã
ææ¥ã¯ @meiheiãã㨠shota.imazekiããã®è¨äºãçºè¡¨ããã¾ãããæ¥½ãã¿ã«ï¼