如何让安卓应用程序适配不同的屏幕大小?

3
我正在创建我的第一个Android应用程序,这让我感到非常疯狂。
我的应用程序是为Android智能手机设计的,并且我只需要一个特定的布局设计。我不需要为每个设备更改布局设计。我想要做的就是调整布局大小以支持所有不同的屏幕尺寸和分辨率。我已经尝试了多种方法,但似乎都做不好。
例如: 我在页面上有几个按钮,这些按钮需要处于我作为背景的图像上的特定点。即使设备的屏幕尺寸增加或屏幕分辨率增加,这些按钮仍需要处于图像上相同的位置。
关于我的应用程序的一些信息: - 我所有的按钮位置都是在DIP中(我尝试过的解决方案之一) - 我的布局XML文件位于名为“layout”的文件夹中
非常感谢任何帮助!
以下是我其中一个布局的代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/mybackground"

>
<Button  
android:layout_width="115dip" 
android:layout_marginTop="450dip" 
android:layout_marginLeft="105dip" 
android:layout_height="50dip" 
android:id="@+id/button01"

>
</Button>

<Button  
android:layout_width="70dip" 
android:layout_marginTop="460dip" 
android:layout_marginLeft="250dip" 
android:layout_height="40dip" 
android:id="@+id/button03"

>
</Button>




</RelativeLayout>

上面的代码是我的一个布局。这个布局有两个按钮,需要与背景“mybackground”在同一位置。这些按钮已应用透明属性,使图像上的元素成为“按钮”。这在我的Droid2上可以工作,但当应用于更大或更密集的屏幕时,按钮不再与图像相对位置正确。


你在AndroidManifest.xml中使用了<supports-screens android:anyDensity="true" />吗?如果你要支持1.5设备,这很重要。 - LeffelMania
如果您只支持API >= 4,那么这将变得更加容易(您肯定已经阅读了支持多屏幕)。然而,从您的示例中看来,您想要在图像上创建一个绝对布局,这并不是一个好主意,正如您所发现的那样。 - bigstones
bigstones- 我发现你说得对。我已经阅读了“支持多屏幕”文章,那是我了解dip的地方。我希望用户能够在最新版本的Android上运行该应用程序,以便所有Android用户都可以使用它。然而,我们的目标是为智能手机用户提供服务,而不是平板电脑用户。由于我们主要面向手机用户,所以可能不会超过Android 2.3版本。 - Patrick C.
你的布局实际上没有使用任何RelativeLayout对齐功能,你只是使用边距以像素为单位定位元素。 dips作为一种度量单位并不是将设备视为具有相同分辨率的方法,而是在调整元素大小时处理像素密度非常不同的设备的一种方式。 - adamp
3个回答

2
在Rollin_s的问题上,adamp在他的评论中所说的是:你需要按钮放在背景的特定位置的原因是什么?如果那个位置是另一张图片(例如),需要对齐,将该图像作为自己的ImageView并使用RelativeLayout参数对齐按钮。也许如果您包含了屏幕截图,有人可以给您一个更好的示例。此外,GridView和TableLayout是用于对齐布局组件以适应不同屏幕大小的好对象。

谢谢你为我澄清这个问题。我正在为某人开发这个应用程序。他们已经预先构建了这些UI图像,因为他们也在使用iPhone版本。我正在使用这些图像作为背景,并在图形UI上放置透明按钮。这很有效,我已经完成了UI。我遇到的问题是,背景图像(即图形UI)无论大小如何都会填充屏幕,但是如果屏幕与我的Droid2不同,则按钮位置不正确。 - Patrick C.
我更熟悉iPhone SDK,并已经为其开发了几个应用程序。在创建iPhone应用程序时,我可以按照自己的意愿创建界面,操作系统会在iPhone 4上运行时进行缩放,因为它比3G和3GS更密集。这也适用于iPad,操作系统会以“窗口”模式运行它,或者将其缩放到接近iPad屏幕大小。我希望在这个Android应用程序中做类似的事情。我似乎找不到任何关于操作系统自动缩放的信息,但如果有开发人员可以使用的代码,我不介意自己添加代码。 - Patrick C.
1
iPhone 4的分辨率之所以被选中,是因为当缩放为旧设备构建的UI时,它可以完美地将像素加倍。Android设备分辨率更加多样化,仅仅缩放到原始设计分辨率的倍数之外会产生丑陋的伪影,最坏的情况下会导致纵横比扭曲。你可以做到,这并不难,但结果在许多设备上会非常粗糙。在Android上,像素完美地对齐UI元素和背景图像并不是构建良好UI的可行方法。 - adamp

0

谢谢你们两个的回答!我正在使用<supports-screens>代码,而且我已经在使用相对布局。然而,我在Atrix 4G和Droid 2上尝试了我的应用程序的同一版本(它们有稍微不同的屏幕),但按钮的位置不同。有什么建议吗? - Patrick C.
2
放弃将屏幕元素与背景上像素完美位置进行匹配的想法。当分辨率和宽高比因设备而异时,这种方法行不通。您的背景可能在模拟其他旨在将用户界面绑定在一起的视觉元素。您能否将其拆分为可以由RelativeLayout或类似布局定位的不同视图中的元素? - adamp
adamp,我不太明白你在说什么。我将在这里发布一个布局的代码,这样你们就能看到我要做的事情了。也许我做得不对。 - Patrick C.
@adamp和@Rollin_s,我查看了相对布局的布局参数。我认为我可以使用_alignRight、_alignLeft和_alignBottom来使我的按钮移动到它们需要的位置,但是我想将按钮设置得比屏幕绝对底部高一点。我可以通过使按钮变大以覆盖我需要的区域来实现这一点。这个观点正确吗?我将在原始帖子中添加我的图像截图以帮助澄清。 - Patrick C.
我无法添加图片,因为我是StackOverflow的新手。 - Patrick C.

0
听起来有点奇怪,但如果你手头只有一个等效的 iPhone UI 压扁图像,而且你需要添加的唯一 UI 元素是在其上方的按钮,我可能会尝试以下这种替代方法,而不是费力地让透明的按钮对齐:
  • 确定您的按钮位置相对于您的普通/未缩放图像的位置,在所选择的某些数据结构中记录其顶部、左部、底部和右部值
  • 将您的图像放置在设置为 FitXY 的 ImageView 中进行缩放
  • 通过检查 ImageView 的 H&W 并将其与原始图像的 H&W 进行比较,计算 Android 应用到您的图像的缩放比例
  • 对原始值的顶部、左部、底部和右部值进行一些数学计算以进行缩放
  • 然后在图像视图的 onClick 处理程序中,您应该能够测试触摸坐标是否在现在已经具有的任何缩放边界内。

这样做可能会更准确、更易于维护,而且不会那么麻烦,比调整布局要好得多。

当然,更正确的解决方案是获取用于制作 iPhone 应用程序的实际单个图形元素,并在 Android 中正确重新实现 UI。

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接