Android屏幕尺寸和屏幕密度图像选择

问题描述 投票:3回答:1

尝试在不同尺寸的设备上使用多个水平图像时遇到问题。 我有7个单独的Ratingbars,每个都使用不同的自定义图像。 我缩放了所有图像并将它们放入各自的dpi可绘制文件夹中。 我遇到的问题是在xlarge mdpi屏幕上(左下图),它们非常适合,但是当我在较小的屏幕上观看它们时,整个7个评级栏太宽而不适合在界限范围内该设备,如下所示:

屏幕概述

我已经按照以下答案中所述跟踪了图像的正确缩放(基于mdpi的原始基本大小): https//stackoverflow.com/a/11581786/1634369

ldpi | mdpi | tvdpi | hdpi | xhdpi | xxhdpi | xxxhdpi
0.75 | 1    | 1.33  | 1.5  | 2     | 3      | 4

根据上面的缩放,以下是我的所有可绘制文件夹,显示各自dpi文件夹中每个图像的尺寸(全部基于mdpi比率):

可绘制文件夹结构

然后,为了显示每个评级栏,我为每个评级栏设置了一个选择器,它将使用默认的灰色图像和基于评级值的彩色图像。 下面显示了我用于使用布局显示每个Ratingbars的代码。 注意:我已根据基本mdpi值的宽度和高度。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RatingBar            
        android:numStars="1"
        android:rating="1"
        android:stepSize="0.01"
        android:isIndicator="true"
        android:layout_width="75dp"
        android:layout_height="77dp"
        android:layout_gravity="bottom"
        android:gravity="bottom"                                                          
        android:progressDrawable="@drawable/selector_a" />

    <RatingBar            
        android:numStars="1"
        android:rating="0.5"
        android:stepSize="0.01"
        android:isIndicator="true"
        android:layout_width="73dp"
        android:layout_height="114dp"
        android:layout_gravity="bottom"
        android:gravity="bottom"                                                          
        android:progressDrawable="@drawable/selector_b" />

    <RatingBar            
        android:numStars="1"
        android:rating="0.5"
        android:stepSize="0.01"
        android:isIndicator="true"
        android:layout_width="63dp"
        android:layout_height="132dp"
        android:layout_gravity="bottom"
        android:gravity="bottom"                                                          
        android:progressDrawable="@drawable/selector_c" />

    <RatingBar            
        android:numStars="1"
        android:rating="0.5"
        android:stepSize="0.01"
        android:isIndicator="true"
        android:layout_width="79dp"
        android:layout_height="145dp"
        android:layout_gravity="bottom"
        android:gravity="bottom"                                                          
        android:progressDrawable="@drawable/selector_d" />

    <RatingBar            
        android:numStars="1"
        android:rating="0.5"
        android:stepSize="0.01"
        android:isIndicator="true"
        android:layout_width="79dp"
        android:layout_height="161dp"
        android:layout_gravity="bottom"
        android:gravity="bottom"                                                          
        android:progressDrawable="@drawable/selector_e" />

    <RatingBar            
        android:numStars="1"
        android:rating="0.5"
        android:stepSize="0.01"
        android:isIndicator="true"
        android:layout_width="108dp"
        android:layout_height="168dp"
        android:layout_gravity="bottom"
        android:gravity="bottom"                                                          
        android:progressDrawable="@drawable/selector_f" />

    <RatingBar            
        android:numStars="1"
        android:rating="0.5"
        android:stepSize="0.01"
        android:isIndicator="true"
        android:layout_width="147dp"
        android:layout_height="189dp"
        android:layout_gravity="bottom"
        android:gravity="bottom"                                                          
        android:progressDrawable="@drawable/selector_g" />

</LinearLayout>

是否有人能够帮助我确保无论在哪个屏幕上显示Ratingbars,无论设备的密度如何,它总是看起来一样(它在10.1 mdpi屏幕上显示的方式显示在左上角图像显示所有不同的屏幕?任何帮助将不胜感激。

非常感谢您花时间阅读这个问题。 我已将代码放在Github的以下位置: https//github.com/gbayo1/RatingBarScalingIssue.git

android image scaling screen-size ratingbar
1个回答
0
投票

您可以使用LinearLayoutlayout_weight在屏幕上平均分配Views 。 要使layout_weight工作,您必须将layout_width设置为0dp 。 这是正常的,不要让自己感到困惑。 如果您想要垂直均匀分布,则必须将layout_height设置为0dplayout_weight告诉LinearLayout应该将View与其他View进行比较。 在您的情况下,我们希望所有Views均匀分布,因此它们都需要具有相同的宽度。 这就是我们为所有Views分配相同layout_weight - 1 。 你可以使用layout_weight做更多的事情,例如,如果你有两个视图,并且你希望左视图占据屏幕的三分之二,而右视图占据屏幕的三分之一,你将为左边的视图分配一个layout_weight 2,右边一个layout_weight为1。

我相应地修改了你的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">


    <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true">

        <RatingBar
                android:numStars="1"
                android:rating="1"
                android:stepSize="0.01"
                android:isIndicator="true"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:progressDrawable="@drawable/selector_a"/>

        <RatingBar
                android:numStars="1"
                android:rating="0.5"
                android:stepSize="0.01"
                android:isIndicator="true"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:progressDrawable="@drawable/selector_b"/>

        <RatingBar
                android:numStars="1"
                android:rating="0.5"
                android:stepSize="0.01"
                android:isIndicator="true"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:progressDrawable="@drawable/selector_c"/>

        <RatingBar
                android:numStars="1"
                android:rating="0.5"
                android:stepSize="0.01"
                android:isIndicator="true"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:progressDrawable="@drawable/selector_d"/>

        <RatingBar
                android:numStars="1"
                android:rating="0.5"
                android:stepSize="0.01"
                android:isIndicator="true"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:progressDrawable="@drawable/selector_e"/>

        <RatingBar
                android:numStars="1"
                android:rating="0.5"
                android:stepSize="0.01"
                android:isIndicator="true"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:progressDrawable="@drawable/selector_f"/>

        <RatingBar
                android:numStars="1"
                android:rating="0.5"
                android:stepSize="0.01"
                android:isIndicator="true"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:progressDrawable="@drawable/selector_g"/>

    </LinearLayout>
</RelativeLayout>

我假设除了Ratingbars之外,布局中最终会有其他东西,这就是为什么我已经将所有内容都包含在RelativeLayout 。 由于您的自定义progressDrawable ,因为我将layout_height更改为wrap_content ,因此您可能会对评级栏的高度产生一些问题。 如果它不起作用或者你希望它们具有不同的高度,你可以为RatingBars设置一个固定的高度,但保持layout_width

在旁注:您在原始布局中拥有的所有layout_gravitygravity元素基本上都是无用的。 要将所有RatingBars对齐到底部,您只需要在LinearLayout本身上使用android:gravity="bottom"

© www.soinside.com 2019 - 2024. All rights reserved.