【问题标题】:Proper scaling of ImageView and TextViewImageView 和 TextView 的适当缩放
【发布时间】:2013-12-11 14:42:31
【问题描述】:

我的布局中有三个元素,1 个 TextView 和 2 个 ImageView。 TextView 将在顶部,2 个 ImageViews 应该在下方。我希望它们占据等量的空间,我可以将 textview 对齐到空间的中间,而 imageview 可以尝试占据指定位置的宽度和高度。

现在我的图像是 640 x 480。在某些设备上,它完美地占据了高度和宽度。但是,在其他分辨率不同的设备上,它可能只占用它的宽度或高度,中间留有空白。我正在使用权重为 3 个元素分配 3 个分配空间。

由于屏幕分辨率不同,我在布局方面是新手。有没有办法在不同分辨率的设备上动态反映相同的东西?我不应该尝试通过 android:layout_weight 为每个元素分配空间吗?有解决办法吗?

【问题讨论】:

    标签: android android-layout android-imageview


    【解决方案1】:

    您可以在 xml 文件中尝试一些操作。首先,我会尝试使用 RelativeLayout 来定义适当的布局参数。您可以执行android:layout_aboveandroid:layout_alignleft 之类的操作,将图像放置在相对于父容器和顶部的TextView 的位置。然后在 ImageViews 上使用 android:scaleType。这应该将图像放在您想要的位置,然后适当地缩放它们(查看此link 以获取有关缩放的更多信息)。

    您也可以尝试将 ImageViews 放入 FrameLayouts 中,然后像以前一样将这些 FrameLayouts 放入 LinearLayout 中。根据需要设置 FrameLayout 的宽度和高度,可能使用 layout_weight,然后在 ImageViews 上使用 android:scaleType。从性能的角度来看,这种方法并不理想,因为绘制多个布局层的成本可能很高,特别是如果此布局用于列表视图或以其他方式重复。

    【讨论】:

      【解决方案2】:

      您必须使用线性布局并将方向设置为“水平”,然后在 textview 和 imageview 的两行下方使用它。 安卓:布局重量=1; android:layout_width=0;

      【讨论】:

      • 不,我不希望他们并排。我希望它们从上到下对齐,如果可能的话,占据所有的宽度和高度。
      【解决方案3】:

      尝试使用相对布局并在 onCreate 调用函数中调整尺寸 - 像这样

      private void setUpDimensions(){
          Display display = getWindowManager().getDefaultDisplay();
          DisplayMetrics dm = new DisplayMetrics();
          display.getMetrics(dm);
      
          ImageView iv = (ImageView) findViewById(R.id.imageSun);
          RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)iv.getLayoutParams();
          params.height = display.getHeight() * 500 / 800;
          params.width = display.getWidth() * 250 / 1280;
      
          iv = (ImageView) findViewById(R.id.imageDesert);
          params = (RelativeLayout.LayoutParams)iv.getLayoutParams();
          params.height = display.getHeight() * 100 / 800;
          params.width = display.getWidth() * 100 / 1280;
          params.leftMargin = display.getWidth() * 207 / 1280;
      
          iv = (ImageView) findViewById(R.id.imageJungle);
          params = (RelativeLayout.LayoutParams)iv.getLayoutParams();
          params.height = display.getHeight() * 150 / 800;
          params.width = display.getWidth() * 150 / 1280;
          params.topMargin = display.getHeight() * 82 / 800;
      
          params = (RelativeLayout.LayoutParams)newGameButton.getLayoutParams();
          newGameButton.setTextSize(50 * display.getHeight() / 800 / dm.scaledDensity);
          newGameButton.setTypeface(worldData.getTypeface());
          params.leftMargin = display.getWidth() * 430 / 1280;
          params.topMargin = display.getHeight() * 310 / 800;
      
      }
      

      我在 1280x800 res 上设计布局,并使用您在上面从我的布局位置看到的数字。这可确保我的应用支持任何分辨率

      【讨论】:

      • 这不是一个好的解决方案。在 Android 上,xml 布局旨在让我们灵活地让我们的布局在数千台设备上看起来合理。此外,xml 布局有助于使您的实际代码保持简单,并且它们通过将 UI 尽可能地远离您的代码来坚持关注点分离。您也不应该将数字硬编码到布局中。
      • 我的方法确保每个屏幕分辨率看起来都一样,这是我能做到的最好方法。如果有任何其他方法可以使活动在任何设备上看起来都一样,请随时分享。
      猜你喜欢
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多