LinearLayout 中的 ImageView 在背景改变时改变大小

ImageView in LinearLayout changes size when background changes

我正在创建一个应用程序,其中一个方面就是一个非常简单的评级部分。目前非常简单,只需获取平均评分并使用星级显示即可。我有 5 个 ImageViews 以线性布局显示,每个 Imageview 的背景根据评分更改为三个星形可绘制对象之一。下面是星星的布局结构:

starFilled = ContextCompat.getDrawable(requireContext(), R.drawable.ic_baseline_star_rate_24);
          starOutline = ContextCompat.getDrawable(requireContext(), R.drawable.ic_baseline_star_outline_24);
        halfStar = ContextCompat.getDrawable(requireContext(), R.drawable.ic_baseline_star_half_24);enter code here


            <LinearLayout
                android:id="@+id/overall_rating_stars"
                android:layout_width="wrap_content"
                android:layout_height="35dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@id/overall_rating_title">

                <ImageView
                    android:id="@+id/overall_rating_s1"
                    android:layout_width="35dp"
                    android:layout_height="match_parent"
                    android:background="@drawable/ic_baseline_star_outline_24"/>

                <ImageView
                    android:id="@+id/overall_rating_s2"
                    android:layout_width="35dp"
                    android:layout_height="match_parent"
                    android:background="@drawable/ic_baseline_star_outline_24"/>

                <ImageView
                    android:id="@+id/overall_rating_s3"
                    android:layout_width="35dp"
                    android:layout_height="match_parent"
                    android:background="@drawable/ic_baseline_star_outline_24"/>

                <ImageView
                    android:id="@+id/overall_rating_s4"
                    android:layout_width="35dp"
                    android:layout_height="match_parent"
                    android:background="@drawable/ic_baseline_star_outline_24"/>
                <ImageView
                    android:id="@+id/overall_rating_s5"
                    android:layout_width="35dp"
                    android:layout_height="match_parent"
                    android:background="@drawable/ic_baseline_star_outline_24"/>
            </LinearLayout>

下面是我如何改变星星的背景:

private void mapRating(ImageView star1, ImageView star2, ImageView star3, ImageView star4, ImageView star5, double rating) {
        if (rating == 0.0) {
            star1.setBackground(starOutline);
            star2.setBackground(starOutline);
            star3.setBackground(starOutline);
            star4.setBackground(starOutline);
            star5.setBackground(starOutline);
        } else {
            if (rating <= 0.50) {
                star1.setBackground(halfStar);
            }
            if (rating > 0.50) {
                star1.setBackground(starFilled);
            }
            if (rating > 1.00 && rating <= 1.50) {
                star2.setBackground(halfStar);
            }
            if (rating > 1.50) {
                star2.setBackground(starFilled);
            }
            if (rating > 2.00 && rating <= 2.50) {
                star3.setBackground(halfStar);
            }
            if (rating > 2.50) {
                star3.setBackground(starFilled);
            }
            if (rating > 3.00 && rating <= 3.50) {
                star4.setBackground(halfStar);
            }
            if (rating > 3.50) {
                star4.setBackground(starFilled);
            }
            if (rating > 4.00 && rating <= 4.50) {
                star5.setBackground(halfStar);
            }
            if (rating > 4.50) {
                star5.setBackground(starFilled);
            }
        }
    }

这当然不是更改星星的最精致或优雅的方式,但我的问题是至少有一颗星星的大小似乎在 运行 应用程序和查看评级时发生了变化:smaller 5th star, smaller 4th star,smaller 2nd star

我尝试了很多不同的方法,例如在 XML 和 Fragment 中从背景更改为 src。以及为每个更改 scaleType,但更改为 center|crop 或 center 甚至 XY。但是,它的 none 似乎正在修复它。所有星星都具有相同的高度 (50dp)、宽度 (50dp) 和视口 height/width (24)。帮助将不胜感激,因为这是一个小而令人沮丧的问题。

为什么不用layout.xml中的src? 试试吧...

您可以使用 RatingBar 来评分,而不是创建您自己的。我附上了两个链接供您参考。请检查一下。

Google developer link for ratingbar

Youtube link for RatingBar