处理所有屏幕尺寸的安卓应用

9
我正在开发一个Android应用程序,它使用数字(如边距等),没有相对的元素。因此,我认为在不同的屏幕尺寸上会遇到许多问题。所以,我想制作一个函数,可以根据用户的屏幕尺寸,使数据保持与DIMENSIONS文件中的比例相同,就像这样 (用户屏幕尺寸X dimen) / (应用程序设计时的屏幕尺寸)。因此,我想知道这是否会对应用程序的工作造成任何问题...谢谢=)

1
这个问题没有一个确定的答案。它真的取决于你的布局、你所拥有的可绘制对象等等。有时候只需要缩放就可以解决问题。有时候不行(当缩小时,物体无法适应,图像过度拉伸等)。小边距(特别是在 dp 中的低双位数)通常可以很好地缩放。而像素值在 100 左右的数字可能不行。作为 Android 工程师,找出这些相对和线性关系并从中创建良好的布局是你的工作的一部分。如果你期望所有东西都被交给你,那么你就不会被需要了。 - Gabe Sechan
3个回答

11
//Dimen
implementation 'com.intuit.ssp:ssp-android:1.0.5'
implementation 'com.intuit.sdp:sdp-android:1.0.5'

使用这两个库,ssp用于文字大小,sdp用于边距、内边距和布局大小

android:layout_width="@dimen/_24sdp"
android:layout_height="@dimen/_24sdp"

我们可以在程序中使用它吗? - Arnold Brown
@ArnoldBrown 是的,你可以。 - divaPrajapati09
@divaPrajapati09 是的,我做了这个。谢谢。 - Arnold Brown
@harshil-kakadiya 在示例中,他们有两个活动,一个使用ssp,另一个示例在其他项目中仅使用sdp。我正在遵循您的建议,但您能解释一下为什么吗? - Rahul Kahale
使用ssp设置文本大小,其余则使用sdp。 - Arnold Brown

6
你可以尝试使用下面这个库,它可以自动管理所有屏幕尺寸的分辨率。 compile 'com.intuit.sdp:sdp-android:1.0.4' 你只需要在build.gradle文件中添加依赖项就行了。
你需要像这样指定: android:layout_height="@dimen/_10sdp" 而不是这样: android:layout_height="@dimen/10sdp"

6
我尝试过这个库,但它只是放大了所有东西。 - Benson Githinji
这个库看起来相当不错,唯一的问题是它的行为像一个框架。如果你想要更多的控制,那么使用不同的布局文件会更好,特别是对于图片大小。 - DragonFire
我们可以在程序中使用它吗? - Arnold Brown
@ArnoldBrown 您可以使用以下代码来动态访问dimen。int dp = (int) (getResources().getDimension(R.dimen.test) / getResources().getDisplayMetrics().density) - Mayank Sharma

3
在您的res文件夹中为所有设备创建三个不同的布局文件夹,并相应地使用尺寸。 通用布局文件夹
res/layout-small
res/layout-normal
res/layout-large
res/layout-xlarge

完成Normal/Medium布局后,请按以下步骤操作:

  1. 将Normal Dimensions转换为其他屏幕尺寸。
  2. 将Normal Layout xml文件复制到其他文件夹中。
  3. 根据所在文件夹更改使用的维度的后缀。
  4. 调整drawable文件夹中的图像资源大小(宽度和高度-与我们用于转换dimens的技术相同),并将它们放置在各自的drawable文件夹中(drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xdpi等)。
  5. 然后,您的布局应该在每个设备上正确定位。

要进行值转换

0.75 - ldpi  (small)   //mdpi dimens *0.75
1.0  - mdpi  (normal)  //First create these dimensions
1.5  - hdpi  (large)   //mdpi dimens *1.5
2.0  - xhdpi (xLarge)  //mdpi dimens *2.0

例如

android:layout_width="66dip" //in normal
android:layout_width="100dip"//in large 66*1.5=100(approx)
android:layout_width="52dip" //in small 66*0.75=52(approx)

新增了限定符

  • SmallestWidth(最小宽度)
  • AvailableScreenWidth(可用屏幕宽度)
  • AvailableScreenHeight(可用屏幕高度)

可以在这里了解更多相关信息。

希望这能帮到您。


非常感谢,我还有一个问题,如果您能帮忙:为了让用户可以通过我的应用上传图片,我添加了三个ImageView并使它们可点击。因此,当用户点击第一个ImageView时,它会带他进入图库,上传图片并更改ImageView的颜色,使其不再可点击(这就是应该发生的)。但是,当我测试它时,我需要完成所有这些步骤,并再次单击ImageView并退出图库,以便我可以看到我的ImageView更改颜色并且不可点击。我希望您明白我的意思,谢谢。 - Amine boujida
我一定会帮忙,但如果上述问题已经解决,请接受这个答案。对于另一个问题,您需要提出单独的问题并在评论中给我链接 :) - Jayanth

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