質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Q&A

1回答

243閲覧

Flutter:SweepGradient(グラデーション)を使用した円弧ゲージで色の境目が見えしまう問題

退会済みユーザー

退会済みユーザー

総合スコア0

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

0グッド

0クリップ

投稿2025/05/11 07:17

実現したいこと

自然なグラデーションが掛かった円弧ゲージを実装したい。

発生している問題・分からないこと

予め定義してあるSweepGradientの情報をインプットに、CustomPainterを用いて円弧ゲージの実装を行なってみたが、一部だけくっきりと色同士の境界線が見えてしまっている。
何故自然なグラデーションではなく、境目が見えてしまうようになっているのか、原因及び解決策が知りたい。
イメージ説明

該当のソースコード

Flutter

1final gradient = SweepGradient( 2 colors: [ 3 Color(0xffF2E5BF), 4 Color(0xffF2E5BF), 5 Color(0xffFFFDF6), 6 Color(0xff948979), 7 ], 8 stops: [ 9 0.2, 10 0.25, 11 0.4, 12 0.6, 13 ], 14 transform: GradientRotation(1.57), 15); 16 17 18~省略~ 19 20@override 21 Widget build(BuildContext context) { 22 return Scaffold( 23 body: Stack( 24 children: [ 25 // GaugePainter 26 Positioned( 27 left: 368, 28 top: 88, 29 child: CustomPaint(painter: GaugePainter(), size: Size(730, 730)), 30 ), 31 ], 32 ), 33 ); 34 } 35 36class GaugePainter extends CustomPainter { 37 @override 38 void paint(Canvas canvas, Size size) { 39 const strokeWidth = 18.0; 40 final center = Offset(size.width / 2, size.height / 2); 41 final radius = (size.width / 2) - (strokeWidth / 2); 42 final rect = Rect.fromCircle(center: center, radius: radius); 43 44 final paint = 45 Paint() 46 ..style = PaintingStyle.stroke 47 ..strokeWidth = strokeWidth 48 ..strokeCap = StrokeCap.butt 49 ..shader = gradient.createShader( 50 Rect.fromCircle(center: center, radius: radius), 51 ); 52 // 色同士の境界線が見えてしまう 53 canvas.drawArc(rect, _degreeToRad(0), _degreeToRad(360), false, paint); 54 } 55 56 double _degreeToRad(double degree) => degree * pi / 180; 57 58 @override 59 bool shouldRepaint(GaugePainter oldDelegate) => false; 60} 61

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

グラデーションの変数(gradient)の中身に原因があるのか、もしくはその他の実装部分に原因があるのかが知りたい。
あまり変数(gradient)の中身は変更したくはないが、そこで設定されている数値(stop)や色が原因の場合は教えていただきたいです。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

SweepGradientの設定方法に問題がある。
グラデーション作成のためのデータの最後に、1行目の色を割り当て、それ用のstopsの値を1.0にする。

https://api.flutter.dev/flutter/painting/SweepGradient-class.html
リファレンスのサンプルの中のコメントが参考になるかな。

開始角度がstopsの0、終了角度がstopsの1に該当し、その角度の間をどういった色で遷移させていくのかというのが仕様になる。

提示された例ではColor(0xff948979)の色が0.6(60%)の場所になるようにするという指示で、それ以降の色の指定がないから100%(終了角度)までColor(0xff948979)の色を続けて使用するという指定になる。
そのため、開始角度の部分で0番目の色Color(0xffF2E5BF)に急に切り替わるといった塗り方になった。

修正後の内容。

dart

1final gradient = SweepGradient( 2 colors: [ 3 Color(0xffF2E5BF), 4 Color(0xffF2E5BF), 5 Color(0xffFFFDF6), 6 Color(0xff948979), 7 Color(0xffF2E5BF), // 追加 8 ], 9 stops: [ 10 0.2, 11 0.25, 12 0.4, 13 0.6, 14 1.0, // 追加 15 ], 16 transform: GradientRotation(1.57), 17);

投稿2025/05/12 02:24

ta.fu

総合スコア1742

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問