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 来评分,而不是创建您自己的。我附上了两个链接供您参考。请检查一下。
我正在创建一个应用程序,其中一个方面就是一个非常简单的评级部分。目前非常简单,只需获取平均评分并使用星级显示即可。我有 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 来评分,而不是创建您自己的。我附上了两个链接供您参考。请检查一下。