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

时间:2014-05-14 20:06:46

标签: android image scaling screen-size ratingbar

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

Screens Overview

我已按照以下答案中所述,对图像进行了正确的缩放(基于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比率):

Drawable Folder Structure

然后,为了显示每个评级栏,我为每个评级栏设置了一个选择器,它将使用默认的灰色图像和基于评级值的彩色图像。下面显示了我用于使用布局显示每个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>

是否有人能够帮助我确保无论在哪个屏幕上显示等级栏,无论设备的密度如何,它总是看起来一样(它在10.1 mdpi屏幕上显示的方式显示在顶部左边的图像显示了所有不同的屏幕?非常感谢任何帮助。

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

1 个答案:

答案 0 :(得分:0)

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

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

Ratingbars

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

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