3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Microsoft Power AppsAdvent Calendar 2024

Day 2

Power Appsの画像コントロールひとつで星評価!

Posted at

はじめに

Power Apps標準の星評価は整数単位になっているので、これまで小数点が必要な場所では「★1.5」のように表示していたのですが、とあるウェブ企業による添削で「Power Appsで出来るかは知らんけど、普通は星を並べるもんだよね(脳内意訳)」という指摘があったので、意地になって作ってみました(本当はこんな表現本質じゃないのにね!)
 ギャラリーを使ったり、星画像を並べたりと色々考えた結果、最終的にSVGを使った画像1枚になりましたので、自慢させてください。

まずは情報収集

 SVGで作るといっても、私はこれまでHiroさんの記事を参考にありもののSVGを貼り付けたことしかありませんでした。
Power Apps で SVG を使う - MoreBeerMorePower
 そこで、まずは先達の知見を得るべく、検索してみたところ、そのものズバリのページを見つけました。
SVGでスターレーティングを実装する #CSS - Qiita
 ところが、こちらを貼り付けても、うまく動作しません。試行錯誤の結果、useとurlのところで引っかかっていることがわかり、修正しました。
その際参考にさせていただいたサイトは、以下のとおりです。
<use> - SVG: スケーラブルベクターグラフィック
Power Apps でのSVG 表現メモ - コルネの進捗や備忘録が記されたなにか

先達の皆様、どうもありがとうございました!

こんなのを作った

 出来たSVG画像を確認するために、このようなアプリを作成しました。
image.png
5つ星の画像と同じ幅のスライダーの値に応じて、星が塗りつぶされます。

コントロールの追加と設定

コントロール一覧

コントロール名 種類 説明
imgStarRating 画像 星を表示する画像コントロールです
sldRatingRatio スライダー 星を塗りつぶす割合を示すスライダーです

画像コントロール(imgStarRating)の設定

プロパティ名 設定値 コメント
Height 50 画像の高さ。★の高さでもあります
Width 250 画像の幅。★が5つ並ぶので、高さを5倍します
ImagePosition Fit(自動調整) SVGの設定に関わらず調整するようFitにします
Image 後述

スライダーコントロール(sldRatingRatio)の設定

プロパティ名 設定値 コメント
Height 50 画像の高さ。画像コントロールに合わせました
Width 250 画像の幅。画像コントロールに合わせました
Default 0 スライダーの初期値。なんでも良いです
Max 100 100%にするために、100を入れます
Min 0 開始は0です
ShowValue false 星と重なるため非表示にします

imgStarRating.Imageプロパティの設定

 以下のコードをImageプロパティに貼り付けます。
基本的に、With文内の変数に0~5の点数と好きな色を設定すれば使えると思います。

Image1:Image
//With文の変数に、点数と色を設定してご利用ください
//画像の大きさは画像コントロールの値を反映しておらず、自動調整に任せています
//use要素の最初の5行で星を塗潰しか透過か判断しながら横並びに5個配置し、最後の1行で欠ける星の位置と割合を判断してマスクしています
With(
   {
       rating:sldRatingRatio.Value/20, //星評価の点数。0~5の範囲になるよう調整します
       fillcolor:"#ffb200",            //星を塗りつぶす色。文字列です
       linecolor:"blue"                //星の枠線の色。こちらも文字列です
   },
   "data:image/svg+xml," & 
   EncodeUrl(
       "
       <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 32'>
           <defs>
               <mask id='mask'>
                   <rect x='0' y='0' width='32' height='32' fill='white' />
                   <rect x='" & (rating-RoundDown(rating,0))*32 & "' y='0' width='32' height='32' />
               </mask>
               <symbol id='star'>
                   <path d='M31.547 12a.848.848 0 00-.677-.577l-9.427-1.376-4.224-8.532a.847.847 0 00-1.516 0l-4.218 8.534-9.427 1.355a.847.847 0 00-.467 1.467l6.823 6.664-1.612 9.375a.847.847 0 001.23.893l8.428-4.434 8.432 4.432a.847.847 0 001.229-.894l-1.615-9.373 6.822-6.665a.845.845 0 00.214-.869z' stroke='" & linecolor & "' />
               </symbol>
           </defs>
           <use href='#star' x='0'   fill='" & If(rating>=1,fillcolor,"transparent") & "' />
           <use href='#star' x='32'  fill='" & If(rating>=2,fillcolor,"transparent") & "' />
           <use href='#star' x='64'  fill='" & If(rating>=3,fillcolor,"transparent") & "' />
           <use href='#star' x='96'  fill='" & If(rating>=4,fillcolor,"transparent") & "' />
           <use href='#star' x='128' fill='" & If(rating>=5,fillcolor,"transparent") & "' />
           <use href='#star' x='" & RoundDown(rating,0)*32 & "' fill='" & fillcolor & "' mask='url(#mask)'/>
       </svg>
       "
   )
)

動かしてみよう

 出来たら動かしてみましょう。スライダーの動きに合わせて、塗りつぶされる範囲が変わりましたか?

おわりに

 何か作った気になって書いてきましたが、所詮は諸先輩がたの知見のツギハギに過ぎません。
それでも、とあるウェブ企業を(勝手に)見返せた、という満足感はハンパありません。
改めて、Hiroさん、boluyama1028さん、MDNの皆さん、コルネさん、ありがとうございました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?