fix(#173): 9-slice dynamique sur les bulles (centerSlice)

Coins fixes, bords et centre extensibles selon la taille réelle
de la bulle — sans assets .9.png Android.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-01 17:10:40 +02:00
co-authored by Cursor
parent d53682110d
commit ebf77b1ebb
2 changed files with 23 additions and 4 deletions
+13 -1
View File
@@ -1,3 +1,5 @@
import 'package:flutter/material.dart';
enum CardColorVertical { enum CardColorVertical {
red('assets/cards/card_red.png'), red('assets/cards/card_red.png'),
pink('assets/cards/card_pink.png'), pink('assets/cards/card_pink.png'),
@@ -22,4 +24,14 @@ enum CardColorHorizontal {
final String path; final String path;
const CardColorHorizontal(this.path); const CardColorHorizontal(this.path);
}
/// Taille intrinsèque des PNG `card_*_h` (~1024×512).
static const Size sourceSize = Size(1024, 512);
/// Facteur d’affichage : PNG ~2× → coins 9-slice en taille logique correcte.
static const double displayScale = 2.0;
/// 9-slice en pixels image : coins fixes, bords H/V + centre extensibles.
/// Même logique que extensible.png — sans fichier `.9.png` Android.
static const Rect centerSlice = Rect.fromLTRB(100, 90, 924, 422);
}
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:p_tits_pas/models/card_assets.dart';
import 'package:p_tits_pas/models/carte_bulle.dart'; import 'package:p_tits_pas/models/carte_bulle.dart';
import 'package:p_tits_pas/services/api/cards_service.dart'; import 'package:p_tits_pas/services/api/cards_service.dart';
import 'package:p_tits_pas/widgets/quotidien/quotidien_theme.dart'; import 'package:p_tits_pas/widgets/quotidien/quotidien_theme.dart';
@@ -287,14 +288,20 @@ class _BulleTile extends StatelessWidget {
return Opacity( return Opacity(
opacity: treated ? 0.55 : 1, opacity: treated ? 0.55 : 1,
child: Container( child: Container(
constraints: const BoxConstraints(minHeight: 88), constraints: const BoxConstraints(minHeight: 96),
decoration: BoxDecoration( decoration: BoxDecoration(
image: DecorationImage( image: DecorationImage(
image: AssetImage(card.backgroundAsset), image: AssetImage(
card.backgroundAsset,
scale: CardColorHorizontal.displayScale,
),
// 9-slice dynamique : coins fixes, bords / centre étirés
// selon la taille réelle de la bulle (tout écran).
centerSlice: CardColorHorizontal.centerSlice,
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
), ),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), padding: const EdgeInsets.fromLTRB(20, 14, 20, 14),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [