Pressableとは何か、React Nativeでのプレス処理

著者: IT Sectr 公開日: 2026-07-06 読了時間: 10 分

Pressableは、レガシーなTouchableHighlight、TouchableOpacity、TouchableWithoutFeedbackを置き換える、React Nativeのモダンなタッチ処理コンポーネントです。Pressableはpressed、hovered、focusedの状態検出を備えた統一APIを提供します。このコンポーネントはReact Native 0.63で導入され、Metaはすべての新規プロジェクトでPressableを推奨しています。詳細はMetaのドキュメントをご覧ください。

重要ポイント

  • Pressable — pressed、hovered、focused状態をサポートする汎用タッチ処理コンポーネント
  • APIはonPress、onLongPress、onPressIn、onPressOutコールバックと状態ベースのスタイリング関数を提供
  • hitSlopはコンポーネントの表示境界を超えてタッチ領域を拡張し、UXを向上
  • Touchableの置き換え — PressableはすべてのTouchableコンポーネントのAPIを1つの柔軟なインターフェースに統一
  • アクセシビリティ — ARIAロールをサポートし、VoiceOverとTalkBackを自動処理

Pressableとは?

Pressableは、あらゆる種類のタッチを処理するための統一インターフェースを提供するReact Nativeコンポーネントです。3つの異なるTouchableコンポーネント(TouchableHighlight、TouchableOpacity、TouchableWithoutFeedback)とは異なり、Pressableは1つの柔軟な状態とスタイリングシステムでそれらすべてを置き換えます。

このコンポーネントはReact Native 0.63(2020年9月)で導入されました。Meta(2026年)によると、React Nativeの新規プロジェクトの70%がTouchableコンポーネントの代わりにPressableを使用しています。PressableはTouchableの主要な問題 — 断片化されたAPIと異なるエフェクトごとにコンポーネントを切り替える必要性 — を解決します。

Pressableの哲学

プレスエフェクトが固定されている(不透明度の変更)TouchableOpacityとは異なり、Pressableは現在の状態を受け取る関数を提供します。開発者はプレスに対して視覚的にどのように反応するか(色、スケール、影、またはエフェクトの組み合わせの変更)を決定できます。これにより、UXを完全に制御できます。

Pressableの状態: pressed、hovered、focused

Pressableは3つのインタラクション状態を定義します: pressed(画面に指)、hovered(Web/TVで要素にカーソル)、focused(キーボードフォーカス中の要素)。各状態は対応するコールバックをトリガーし、スタイル関数と子レンダリング関数に渡されます。

状態条件典型的な反応
pressed画面に指がある、またはクリックを押し続けている不透明度、スケール、背景色の変更
hovered要素にカーソルがある(Web、TV)ハイライト、シャドウ、下線
focusedキーボードフォーカス中の要素アウトライン、ボーダー、色の変更

重要: hoveredとfocusedはポインター対応プラットフォーム(Web、Android TV、Apple TV)でのみ機能します。モバイルデバイスではpressedのみが利用可能です。クロスプラットフォームアプリケーションでは、この制限を考慮して視覚的な反応を設計してください。

js
<Pressable
  style={({ pressed }) => [
    styles.button,
    pressed && styles.buttonPressed,
  ]}
  onPress={handlePress}>
  {({ pressed }) => (
    <Text style={pressed ? styles.textPressed : styles.text}>
      {pressed ? 'Release' : 'Press'}
    </Text>
  )}
</Pressable>

PressableのAPIとコールバック

Pressable APIには4つの主要なコールバックがあります: onPress(離すまでの完全なプレス)、onLongPress(長押し)、onPressIn(タッチ開始)、onPressOut(タッチ終了)。onPressInとonPressOutの組み合わせにより、カスタムアニメーションを作成できます。

追加のプロパティ: delayLongPress(長押しの遅延、デフォルト500 ms)、pressRetentionOffset(プレスがキャンセルされる領域)、android_ripple(Androidでのリップル効果)。注: RippleはAndroid 5+でのみ機能します。

js
<Pressable
  onPress={() => console.log('押下')}
  onLongPress={() => console.log('長押し')}
  onPressIn={() => console.log('指を下に')}
  onPressOut={() => console.log('指を上に')}
  delayLongPress={300}
  android_ripple={{ color: 'rgba(0,0,0,0.1)', borderless: false }}
  style={styles.button}>
  <Text>Press me</Text>
</Pressable>

onPressは、コンポーネント領域内(pressRetentionOffsetを考慮)で指が離された場合にのみ呼び出されます。ユーザーが指を境界外に移動すると、onPressはトリガーされず、誤ったプレスを防ぎます。onPressOutは離されたときに常に呼び出されます。

hitSlop: タッチ領域の拡張

hitSlopは、コンポーネントの表示境界を超えてタッチ領域を拡張するPressableのプロパティです。これはアイコン、チェックボックス、ラジオボタンなどの小さな要素にとって重要です。Apple HIGは最小タッチターゲットサイズ44×44ポイントを推奨しています。hitSlopを使用すると、視覚的なサイズを変更せずにこの要件を満たせます。

hitSlopはオブジェクト{ top, bottom, left, right }またはすべての辺に単一の数値を受け入れます。値は論理ピクセル(dp/pt)で指定します。24×24のアイコンの場合、44×44のタッチターゲットを達成するには、各辺に少なくとも10–12のhitSlopを推奨します。

js
<Pressable
  hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}
  onPress={handleIconPress}
  style={styles.iconButton}>
  <Icon name="star" size={24} />
</Pressable>

pressRetentionOffset — hitSlopの逆: プレスをキャンセルせずにユーザーがコンポーネント境界外に出られる領域を定義します。デフォルトはhitSlopと同じです。境界外に出てもプレスを維持する必要がある場合は、pressRetentionOffsetを増やしてください。

Pressable vs Touchable: 移行のタイミング

Pressable vs Touchable — タッチ処理コンポーネントを選択する際の重要な問題です。TouchableOpacity、TouchableHighlight、TouchableWithoutFeedbackはレガシーコンポーネントで、削除はされませんが新しい機能は追加されません。Metaは新規プロジェクトにPressableを推奨しています。

Pressableの主な利点: すべてのエフェクトタイプに対応する統一API、カスタムスタイリングのためのpressed状態へのアクセス、hovered/focused状態のサポート、hitSlopとpressRetentionOffset、追加設定なしのonLongPressコールバック。TouchableOpacityは単純な不透明度変更にのみ適しています。

シナリオTouchablePressable
単純なプレスTouchableOpacityPressable + style内のopacity
背景のハイライトTouchableHighlightPressable + backgroundColor
視覚効果なしTouchableWithoutFeedback空のstyleを持つPressable
長押し任意のTouchableのonLongPressPressableのonLongPress
カスタムアニメーションAnimated + onPressIn/OutPressable + useAnimatedStyle
AndroidのRippleTouchableNativeFeedbackPressable + android_ripple

Pressableの使用例

Pressableを使用すると、最小限のコードで複雑なインタラクティブ要素を作成できます。以下は、プレス時のスケール変更とAndroidでのリップル効果を備えたアニメーションボタンの例です。このようなボタンはTouchableOpacity + Animatedの組み合わせを置き換えます。

js
const AnimatedButton = ({ title, onPress }) => {
  const scale = React.useRef(new Animated.Value(1)).current;

  const handlePressIn = () => {
    Animated.spring(scale, {
      toValue: 0.96,
      useNativeDriver: true,
    }).start();
  };

  const handlePressOut = () => {
    Animated.spring(scale, {
      toValue: 1,
      friction: 3,
      useNativeDriver: true,
    }).start();
  };

  return (
    <Pressable
      onPress={onPress}
      onPressIn={handlePressIn}
      onPressOut={handlePressOut}
      android_ripple={{ color: 'rgba(255,255,255,0.3)' }}
      style={styles.button}>
      <AnimatedView style={[styles.inner, { transform: [{ scale }] }]}>
        <Text style={styles.text}>{title}</Text>
      </AnimatedView>
    </Pressable>
  );
};

重要: PressableのアニメーションにはuseNativeDriver: trueを使用してください。これによりアニメーションがネイティブスレッドにオフロードされ、高速なプレス時のフレームドロップを防ぎます。transformとopacityのネイティブドライバーはすべてのプラットフォームでサポートされています。

よくある質問

コードを変更せずにTouchableOpacityの代わりにPressableを使用できますか?

いいえ、Pressableは異なるAPIを持っています。TouchableOpacityはプレス時に自動的に不透明度を適用します。Pressableは状態関数を介して明示的なスタイル指定が必要です。置き換えは簡単です: style={({ pressed }) => [{ opacity: pressed ? 0.5 : 1 }]}を渡します。

Material Designのようなリップル効果を作成するには?

android_rippleプロパティをオブジェクト{ color, borderless }とともに使用します。リップルの色はrgba形式で指定します。丸いボタンの場合はborderless: trueを使用します。RippleはAndroid 5+でのみ機能します。iOSではカスタムアニメーションを使用してください。

高速スクロール時にonPressが発動しないのはなぜですか?

Pressableにはスクロール中の誤ったプレスに対する組み込み保護があります。ユーザーがリストをスクロールすると、onPressは呼び出されません。この動作はpressRetentionOffsetとdelayPressInで設定できます。

Pressableで長押しを検出するには?

onLongPressプロパティを使用します — 長押しの組み込みサポート。遅延はdelayLongPress(デフォルト500 ms)で設定できます。コンテキストメニューやドラッグアンドドロップの場合は、onLongPressをonPressInと組み合わせて使用します。

Pressableはキーボードナビゲーションをサポートしていますか?

はい、PressableはAndroid TV、Apple TV、Webでのキーボードナビゲーション用のfocused状態をサポートしています。{ focused }を介したスタイリングを使用してフォーカスを表示します。モバイルデバイスでは、focused状態は該当しません。

まとめ

  • Pressable — タッチ処理のための汎用React Nativeコンポーネント、TouchableOpacity、TouchableHighlight、TouchableWithoutFeedbackを置き換え
  • 状態 pressed、hovered、focusedはスタイル関数に渡され、各シナリオに応じた反応をカスタマイズ可能
  • hitSlopは視覚サイズを変更せずにタッチターゲットを44×44ポイントに拡張、小さな要素のUXを向上
  • APIはonPress、onLongPress、onPressIn、onPressOutを含み、delayLongPressで遅延設定可能
  • android_rippleはAndroid 5+でカスタマイズ可能な色と形状のMaterial Designリップル効果を追加
  • Touchableからの移行では、自動効果を状態関数による明示的なスタイリングに置き換える必要あり
  • Animated + PressableはuseNativeDriverを使用してパフォーマンスの高いスムーズなプレスアニメーションを作成

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください