适用于固定尺寸图像的Drawable和Android屏幕像素密度

时间:2016-04-26 17:38:41

标签: android screen drawable pixel

我在这里的应用程序中遇到了一个与此问题相关的问题。看看你是否可以帮助我:

在我的情况下,我有一个显示标尺的ImageView,然后我需要以实际尺寸显示此规则,其中不需要增长或缩小屏幕尺寸或密度。使用我的Moto G3作为基础,它完美地工作,但是当testo其他设备时,它会失去标尺的实际尺寸,因为图像试图适合屏幕尺寸。

标尺的图像为PNG,尺寸为3600像素x 155像素,最大测量值为30厘米,位于LinearLayout orizo​​ntal内。在我的Moto G3可见区域,它在10厘米,一个更大的屏幕,例如它应该显示更大的标尺区域(例如11到15厘米),但它在屏幕的视野中只有10厘米,显示它随着设备的显示设置和密度而增长和缩小。

在我为每个资源(xxhdpi,xhdpi等)拍摄RAGUA之前,我决定将其迁移到Android的assets文件夹,但仍然遇到同样的问题。

你对如何修复它有所了解吗?

遵循以下代码:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <HorizontalScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        <ImageView
            android:id="@+id/rulerPolegada"
            android:layout_width="1780dp"
            android:layout_height="103dp"
            android:layout_marginTop="-10dp"
            android:layout_marginLeft="@dimen/left_ruler"
            />
        </RelativeLayout>
        </HorizontalScrollView>
    </LinearLayout>

正如我所说,在我为资产成像之后,我开始在java中设置它:

rulerPolegada = (ImageView) view.findViewById(R.id.rulerPolegada);
        rulerPolegada.setImageDrawable(Controller.getImageAssets(getActivity(), "ruler_polegada.png"));

3 个答案:

答案 0 :(得分:1)

由于Understanding Density Independence In Android,您可以按如下方式计算这些值

this table

以下是您可以如何计算您的设备(Moto G3)

  1. 30cm = 11.811 in
  2. Moto G3屏幕密度桶是xhdpi - 320dpi
  3. 320px~ = 1 in
  4. 320px * 11.811in~ = 3780px
  5. 通过这些步骤,您可以计算出图像的大小。

    现在,不是为不同的屏幕密度提供不同的标尺图像,而是将高质量的图像放在drawable-anydpi文件夹中,因为A drawable in res/drawable-anydpi/ also is valid for any screen density. However, in this case, the -anydpi variant trumps any density-specific variant.

    导致DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); // these will return the actual dpi horizontally and vertically float xDpi = dm.xdpi; float yDpi = dm.ydpi;

    不幸的是,您无法直接在布局xml文件中使用计算值 - 需要在Java代码中动态更改ImageView大小。

    以上解决方案应该为您提供体面准确性(可能会有10%的差异),但您可以将DensityMetrics与默认显示结合使用以获得实际的水平和垂直密度,这将有助于您计算图像像素大小更精确。

    x

    修改

    计算480dp:

    1. 30cm = 11.811 in
    2. 密度桶xxhdpi - 480dp
    3. 480px~ = 1in
    4. 480px * 11.811in~ = 5669px

答案 1 :(得分:1)

我不确定你的答案是否正确,因为似乎以前的答案都不满意。我曾遇到同样的问题 - 我需要这个ImageView在没有缩放的情况下在大量设备上具有相同的大小。我通过在dp layout_widthlayout_height

$(".newadded").click(function () { var array = $('#usernames').val().split(","); $.each(array,function(i) { var a = (array[i]); if(a !="") { $('#accordian .custSecCont').show(); uservar += "<option value='" + array[i] + "'>" + array[i] + "</option>"; } }); }); 中提供了定义的值来解决了我的问题

答案 2 :(得分:0)

您应该阅读此guide以便在多屏幕中运行