見出し画像

RatingBar の星の色を黄金に変更する|Android|開発裏話

AdMob の「ネイティブ広告」を、以下で四苦八苦しながらも、リリース済みの Android アプリ「CountablePad」に搭載しました。

ネイティブ広告には「RatingBar」が実装されていましたが、初期状態ではその星(レーティング)の色は独特なスタイルでしたので、カスタマイズしてみました。

完成した星(レーティング)の色(スタイル)は、以下の通りです。

画像1

CountablePad(4.0.4)

Gmail 内で表示される広告の星(レーティング)と同じ色です。やっぱり「黄金」が落ち着きます!


▲ スポンサードリンク


対応方法

実装は、テーマで対応します。以下の「android:theme="@style/Gnt.RatingBar.Small"」を新たに作成します。

res/layout/gnt_small_template_view.xml

<RatingBar
   android:id="@+id/rating_bar"
   android:theme="@style/Gnt.RatingBar.Small"
   style="?android:attr/ratingBarStyleSmall"
   android:background="@color/gnt_white"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical"
   android:numStars="5"
   android:max="50"
   android:stepSize="0.1"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintStart_toEndOf="@id/ad_notification_view"
   app:layout_constraintTop_toTopOf="parent" />
res/values/styles.xml

<resources>
   <style name="Gnt.RatingBar.Small" parent="Widget.AppCompat.RatingBar.Small">
       <!-- The color applied to framework controls in their normal state. -->
       <item name="colorControlNormal">#d6d7d8</item>

       <!-- The color applied to framework controls in their activated (ex. checked) state. -->
       <item name="colorControlActivated">#f3b713</item>

       <!-- Default disabled alpha for widgets that set enabled/disabled alpha programmatically. -->
       <item name="android:disabledAlpha">1.0</item>
   </style>
</resources>

対応は以上で終わりです。


▲ スポンサードリンク


テーマカスタマイズのテクニック

継承している「Widget.AppCompat.RatingBar.Small」の参照を辿っていく(Ctrl+B)と、以下のスタイルを見つけます。

<style name="Widget.Material.RatingBar.Small" parent="Widget.RatingBar.Small">
    <item name="progressDrawable">@drawable/ratingbar_small_material</item>
    <item name="indeterminateDrawable">@drawable/ratingbar_small_material</item>
    <item name="minHeight">16dp</item>
    <item name="maxHeight">16dp</item>
</style>

星(レーティング)は「progressDrawable」のことなので、さらに「@drawable/ratingbar_small_material」を見てみます。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:id="@+id/background">
       <bitmap
           android:src="@drawable/ic_star_black_16dp"
           android:tint="?attr/colorControlNormal"
           android:alpha="?attr/disabledAlpha" />
   </item>
   <item android:id="@+id/secondaryProgress">
       <bitmap
           android:src="@drawable/ic_star_half_black_16dp"
           android:tint="?attr/colorControlActivated" />
   </item>
   <item android:id="@+id/progress">
       <bitmap
           android:src="@drawable/ic_star_black_16dp"
           android:tint="?attr/colorControlActivated"
           android:tileModeX="repeat" />
   </item>
</layer-list>

レイヤー構造になっていて、「android:tint="?attr/colorControlNormal"」と「android:alpha="?attr/disabledAlpha"」を背景に、「android:tint="?attr/colorControlActivated"」を重ねていることが分かります。

つまり、この 3 属性をカスタマイズすれば、星(レーティング)の色(スタイル)を変更できるのです。

その結果が、以下の作成したテーマです。

res/values/styles.xml

<resources>
   <style name="Gnt.RatingBar.Small" parent="Widget.AppCompat.RatingBar.Small">
       <!-- The color applied to framework controls in their normal state. -->
       <item name="colorControlNormal">#d6d7d8</item>

       <!-- The color applied to framework controls in their activated (ex. checked) state. -->
       <item name="colorControlActivated">#f3b713</item>

       <!-- Default disabled alpha for widgets that set enabled/disabled alpha programmatically. -->
       <item name="android:disabledAlpha">1.0</item>
   </style>
</resources>

知ってしまえば、簡単です!


▲ スポンサードリンク

いいなと思ったら応援しよう!