綴Photo の勉強ノートに戻る
開発記録2026.04.16

コードで「手作り感」を出す3つのテクニック — Flutterの微妙な傾き・テープ・付箋

FlutterUICustomPainter

綴Photo の詳細画面を作っていて、どうしても「コードで手作り感」を出したくなった。


「きっちりしてる」は、写真日記には合わない

UI を整えていくと、自然と「きれいに揃える」方向に行きます。中央揃え、等間隔、シンメトリーなレイアウト。

見た目はきれいだが、なんか「写真アルバム感」が出ません。

本物のアルバムは、もう少しバラついています。テープが少し曲がっている、写真が微妙にズレている、付箋がちょっと傾いています。その「ほんのわずかなズレ」が温かみを作っている と気づいた。

Flutter で、そのズレをコードで再現することにした。

傾きはウィジェットの定数。描画のときメモリで回す。DB にも prefs にも保存しない。ドット紙(間隔14px)CustomPainter水平写真偶数の付箋奇数の付箋写真カード約+0.8°左上テープ約-3°右下テープ約+2°偶数は左約-3.8°奇数は右約+3.2°図の傾きは見やすくしてある。数字は実装どおり。本文は端末 SQLite の meanings。傾きもドット座標も保存しない。

テクニック①: 写真カードをほんの少し傾ける

まずは写真カード自体の傾き。

dart
Transform.rotate(
  angle: 0.014, // ラジアン。約0.8度
  child: PhotoCard(...),
)

0.014 ラジアン、度数に直すと約0.8度。逆に2〜3度傾けると「崩れてる」に見えてしまいます。

傾きは描画のときメモリで回す。写真ファイルは触らない。保存しない。水平写真約0.8°(0.014 rad)貼ってある水平写真2〜3°崩れてる図の傾きは見やすくしてある。数字は実装どおり。

0.014 という絶妙な小ささが、「ちょっとズレてる」と「気になる」の境界線だった。


テクニック②: テープを2箇所、異なる角度で貼る

本物のアルバムのテープは、同じ角度で2枚同じ向きには貼りません。

dart
// テープの1枚目
Transform.rotate(
  angle: -0.052, // 約 -3度
  child: Container(width: 60, height: 20, color: AppColors.albumTape),
),
// テープの2枚目
Transform.rotate(
  angle: 0.035, // 約 +2度
  child: Container(width: 55, height: 20, color: AppColors.albumTape),
),

テープ自体はシンプルな半透明の矩形(Container)で十分。角度が全部やってくれます。ここも数度ぶんの小ささ(約3度・2度)がポイントで、大きく振ると「崩れてる」に寄ってしまいます。


テクニック③: 付箋を偶数・奇数で左右交互に傾ける

写真に添える付箋メモを、リスト表示するとき。全部同じ向きに並ぶと、デジタルの整列感が出てしまいます。

解決策は偶数・奇数で傾きを変えること。

dart
final angle = (index.isEven ? -3.8 : 3.2) * (math.pi / 180); // -3.8° / +3.2°
Transform.rotate(
  angle: angle,
  child: StickyNote(text: meaning.text),
),

対称じゃなく、微妙にズラすのがポイント。完全に左右対称だと「交互に並べた」感が出てしまいます。非対称な傾きが「自然にそこにある」印象を作ってくれます。


おまけ: 背景にドット紙を入れる

3つのテクニックに加えて、背景もこだわった。CustomPainter を使ってドット紙の質感を再現。

dart
class DotPaperPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()
      ..color = AppColors.memoryDetailDot // 暖色のベージュをごく薄く(alpha 約0.13)
      ..style = PaintingStyle.fill;
 
    const spacing = 14.0;
    for (double x = spacing / 2; x < size.width; x += spacing) {
      for (double y = spacing / 2; y < size.height; y += spacing) {
        canvas.drawCircle(Offset(x, y), 1.0, paint);
      }
    }
  }
}

色は暖色のベージュをごく薄く(透明度13%ほど)。グレーで均等に打つより、テーマに馴染む暖色を薄く置くほうが「ノートの地の質感」に寄ります。これも「主張しすぎない」が大事で、背景に溶け込むくらいの薄さにした。


まとめ

微妙な傾き(0.014ラジアン)が「手作り感」のすべてを決めます。

こういう細部のこだわりは、機能としては何も増えません。

でも、綴Photo を開いたときに「なんか温かい」と感じてもらえるなら、それがユーザー体験として一番重要なことだと思っている。デジタルにアナログの質感を入れる面白さ、一緒に探っている人がいたら嬉しい。


この記事は2026年4月時点の実装内容で書いています。Flutter の Transform.rotate や CustomPainter の API は安定しているが、見た目の調整値(角度・余白)はアプリのテーマに応じて変わるはずなので、参考程度に。