0

我正在将针对 Galaxy Tab 2 (10".1) 屏幕尺寸编写的应用程序改编为 Nexus 7 (7")。按照 stackoverflow 中的建议,我为所有密度创建了不同的图像尺寸(l|m|h|xh)dpi,还创建了一个特定layout-sw600dp文件夹,其中包含我为 7 英寸屏幕修改的布局。

[编辑]

我添加 <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" /> 到我的Androidmanifest文件中。

[/编辑]

尽管进行了所有这些修改,但我仍在努力在两个设备之间正确缩放drawableBottom(以及上、左、右) 。Buttons

渲染图像的物理尺寸是相同的。因此,Nexus 正在使图标与 Galaxy 一样大(反之亦然)。

据我了解,这两款设备虽然物理尺寸不同,但它们共享相同的像素密度 (xhdpi),这使得 Nexus 从 xhdpi 文件夹中拾取。我错过了什么重要的东西吗?

我应该如何调整我的 drawableBottoms?

4

2 回答 2

0

您是否确定该应用程序专为高密度显示器而设计?尝试在获得权限后将其添加到您的清单中:

<supports-screens android:largeScreens="true"
                  android:normalScreens="true"
                  android:smallScreens="true"
                  android:anyDensity="true"/>
于 2013-04-05T18:07:28.770 回答
0

好的。

可能这不是预期的“THE”解决方案。但它立即对我有用,并且考虑到我必须适应的应用程序的大小,只需付出最小的努力。

以下解决方案基本上可以很好地工作,但(可能)仅适用于这种特定情况,因为 Galaxy Tab 2 和 Nexus 7 共享相同的分辨率。

我如何在几乎没有工作的情况下修复它:

  1. 不要创建较小分辨率的图像(您并不真的需要它),除非您要在许多其他设备上安装(或已经安装)您的应用程序。
  2. 创建两个值文件夹。一个用于 Galaxy Tab 2 (= xlarge),另一个用于 Nexus 7 (= large)。修饰符是屏幕的大小。
  3. 在每个文件夹中放置一个dimen.xml文件,您将分别填写该文件。

对于 Galaxy Tab 2:

<?xml version="1.0" encoding="utf-8"?>
<resources>
[...]
<dimen name="s25sp">25sp</dimen>
<dimen name="s30sp">30sp</dimen>
<dimen name="s35sp">35sp</dimen>
[...]
<dimen name="s25dp">25dp</dimen>
<dimen name="s30dp">30dp</dimen>
<dimen name="s35dp">35dp</dimen>
[...]
</resources>

对于 Nexus 7:

<?xml version="1.0" encoding="utf-8"?>
<resources>
[...]
<dimen name="s25sp">17sp</dimen>
<dimen name="s30sp">21sp</dimen>
<dimen name="s35sp">24sp</dimen>
[...]
<dimen name="s25dp">17dp</dimen>
<dimen name="s30dp">21dp</dimen>
<dimen name="s35dp">24dp</dimen>
[...]
</resources>

Nexus 7 的每个值的获取方式如下: Galaxy_value/10.1*7

  1. 之后,您必须在@dimen/s[0-9]*dp要使用该特定维度时使用。

PS:如果你有一个大型应用程序已经格式化了许多布局,你可以使用这个PERL脚本将每个 [0-9]*dp 和 [0-9]*sp@dimen/s[0-9]*dp @dimen/s[0-9]*sp自动转换为。这里是:

   #!/usr/bin/perl

   $filename = $ARGV[0];
   open (FILE, $filename);

   while (<FILE>) {
      chomp;

      if ( $_ =~ /\"[0-9]*(di?p|sp)\"/) {

         my $pre = $`;
         my $mat = $&;
         my $pos = $';

         $mat =~ s/["]+//g;

         print "$pre\"\@dimen/s$mat\"$pos\n";
      }  elsif ( ($_ !~ /\"[0-9]*dp\"/) && ($_ !~ /\"[0-9]*sp\"/) ) {      
         print "$_\n";
      }
   }

   close (FILE);
   exit;
于 2013-04-07T00:34:12.860 回答