Upgrade to Pro — share decks privately, control downloads, hide ads and more …

既存デザインを変更せずにタップ領域を広げる方法

 既存デザインを変更せずにタップ領域を広げる方法

Shibuya.apk #53 - 20/06/2025
https://shibuya-apk.connpass.com/event/356435/

アニメーションが動かないため、分かりにくいところはグーグルスライドでご確認ください:
https://docs.google.com/presentation/d/1Q_mhqa9oBdkWimUa1jA1t3k0EJOsaK40zZKSY9slwVE/

TouchDelegateの全容:https://gist.github.com/tahia910/4631bf763408c8623854258aaed17cb1

Avatar for Tiphaine

Tiphaine

June 20, 2025
Tweet

More Decks by Tiphaine

Other Decks in Programming

Transcript

  1. 17 fun View.addTouchDelegate() { // タップ領域は最小48dpにする // const val MIN_TOUCH_TARGET_DP

    = 48 val minTouchTargetPx = MIN_TOUCH_TARGET_DP * context.resources.displayMetrics.density } 参考:Trackr(Google)、Tamás Kozmér
  2. 19 fun View.addTouchDelegate() { //... val parent = parent as

    View parent.post { // Viewのタップ領域を取得する(表示されているサイズ) val delegateArea = Rect() getHitRect(delegateArea) val heightPx = delegateArea.height() val widthPx = delegateArea.width() } } 参考:Trackr(Google)、Tamás Kozmér
  3. 20 val parent = parent as View parent.post { //

    ... // 現在のタップ領域の高さが48dp以下の場合、広げる if (heightPx < minTouchTargetPx) { // 実際の差分を計算して、左右に均等に追加する val extraSpace = ceil( (minTouchTargetPx - heightPx) / 2 ) delegateArea.top -= extraSpace.toInt() delegateArea.bottom += extraSpace.toInt() } } 参考:Trackr(Google)、Tamás Kozmér
  4. 21 val parent = parent as View parent.post { //

    ...    // 幅も同様の処理が必要 if (widthPx < minTouchTargetPx) { // Float計算のため、結果をceilで繰り上げする val extraSpace = ceil( (minTouchTargetPx - widthPx) / 2 ) delegateArea.left -= extraSpace.toInt() delegateArea.right += extraSpace.toInt() } } 参考:Trackr(Google)、Tamás Kozmér
  5. 22 val parent = parent as View parent.post { //

    ... // 親に「この範囲なら私のイベントにしてね」と伝える parent.touchDelegate = TouchDelegate(delegateArea, this) } } 参考:Trackr(Google)、Tamás Kozmér
  6. 26 Image( painter = painterResource(R.drawable.ic_close_small), contentDescription = "close", modifier =

    Modifier .sizeIn(18.dp) .wrapContentSize(Alignment.Center) .size(18.dp) .background(Color.Green) .align(Alignment.End) .clickable { }, )
  7. 27 Image( painter = painterResource(R.drawable.ic_close_small), contentDescription = "close", modifier =

    Modifier .sizeIn(18.dp) .wrapContentSize(Alignment.Center) .size(18.dp) .background(Color.Green) .align(Alignment.End) .clickable { }, )