不同分辨率支持android


80

编辑问题:

移动分辨率:
我想设计不同的屏幕dpi,例如以下分辨率。
小320x480,
480×800,
540x960,
720x1280(三星S3),
1080×1920(S4,Nexus5,纳克斯5X,摩托G4),
2560 X 1440(的Nexus 6,纳克斯6P,三星边缘)

平板分辨率:
480×800(Micromax的),
600x1024(三星
Tab2 ),800x1280(nexus 7),
1200x1920(新nexus 7),
2048x1536(nexus 9)

我想根据设备显示分辨率使用不同的字体大小

Q1)best解决此问题的方法是什么problem

Q2)进行抛出编码或XML的最佳选择是什么?

Q3)哪个可绘制文件夹代表哪个设备分辨率?

Q4)应用启动器图标大小是否不同?


15
屏幕分辨率无关紧要。屏幕密度很重要。
CommonsWare

2
看一下[这个答案] [1],然后尝试一下您的代码。[1]:stackoverflow.com/questions/9877946/…–
JJ86

请停止通过琐碎的修改来质疑您的问题。如果这种情况继续下去,我们将锁定问题。
布拉德·拉尔森

2
@Sotti:屏幕尺寸!=屏幕分辨率。
CommonsWare 2014年

1
@Sotti:如果您阅读我的评论,您会注意到我写的屏幕分辨率没有关系。我没有写那个屏幕大小没关系。
CommonsWare 2014年

Answers:


188

应用启动器图标大小(以像素为单位)以实现不同的分辨率

移动分辨率

  • mipmap-mdpi(48X48)
  • mipmap-hdpi(72X72)
  • mipmap-xhdpi(96X96)
  • mipmap-xxhdpi(144X144)
  • mipmap-xxxhdpi(192X192)

平板电脑布局:

如果您希望使用数位板特定的布局,请使用以下文件夹:

layout-large-mdpi   (1024x600)
layout-large-tvdpi  (800x1280)
layout-large-xhdpi  (1200x1920)
layout-xlarge-mdpi  (1280x800)
layout-xlarge-xhdpi (2560x1600)

Drawings文件夹:

  1. 移动

    res/drawable        (default)
    res/drawable-ldpi/  (240x320 and nearer resolution)
    res/drawable-mdpi/  (320x480 and nearer resolution)
    res/drawable-hdpi/  (480x800, 540x960 and nearer resolution)
    res/drawable-xhdpi/  (720x1280 - Samsung S3, Micromax Canvas HD etc)
    res/drawable-xxhdpi/ (1080x1920 - Samsung S4, HTC one, Nexus 5, etc)
    res/drawable-xxxhdpi/ (1440X2560 - Nexus 6,Samsung S6edge).
    
  2. 平板电脑分辨率: 在此处输入图片说明

    字号:

注意:在处理时textSize,请务必尝试使用SP ,例如textsize=12sp

  1. 使用预定义textAppearance

    它将根据设备密度自动设置文本大小。

    <TextView android:textAppearance="?android:attr/textAppearanceSmall"/>
    <TextView android:textAppearance="?android:attr/textAppearanceMedium"/>
    <TextView android:textAppearance="?android:attr/textAppearanceLarge" />
    

    用法示例:

    <TextView
        style="@android:style/TextAppearance.Small"
        android:text="Sample Text - Small" />
    <TextView
        style="@android:style/TextAppearance.Medium"
        android:text="Sample Text  - Medium" />
    <TextView
        style="@android:style/TextAppearance.Large"
        android:text="Sample Text  - Large" />
    
  2. 使用dimension.xml每个设备:

    Google IO Pdf中,我们看到以下结构:

    1. 移动:

      res/values/dimens.xml(default)
      res/values-ldpi/dimens.xml   (240x320 and nearer resolution)
      res/values-mdpi/dimens.xml   (320x480 and nearer resolution)
      res/values-hdpi/dimens.xml   (480x800, 540x960 and nearer resolution)
      res/values-xhdpi/dimens.xml  (720x1280 - Samsung S3, Micromax Canvas HD, etc)
      res/values-xxhdpi/dimens.xml (1080x1920 - Samsung S4, HTC one, etc)
      

      res / values-xxxhdpi / dimens.xml(1440X2560-Nexus 6,三星S6edge)。

    2. 片剂:

      对于平板电脑,你可以像使用更具体的文件夹values-xlargevalues-large

      res/values-large/dimens.xml      (480x800)
      res/values-large-mdpi/dimens.xml (600x1024)
      

      要么

      res/values-sw600dp/dimens.xml      (600x1024)
      res/values-sw720dp/dimens.xml      (800x1280)
      res/values-xlarge-xhdpi/dimens.xml (2560x1600 - Nexus 10")
      res/values-large-xhdpi/dimens.xml  (1200x1920 - Nexus 7"(latest))
      

了解更多信息:

  1. 请参阅支持多屏幕

  2. 有关设计设备的密度,请参见Google IO Pdf的第77页。这样,您将找到处理不同设备的方法。dimens.xml

  3. Nexus 6和Nexus 9准备好应用程序。

支持多屏摘录:

与密度无关的像素等效于160 dpi屏幕上的一个物理像素,这是系统为“中”密度屏幕假定的基线密度。在运行时,系统会根据使用中屏幕的实际密度,根据需要透明地处理dp单位的任何缩放比例。dp单位到屏幕像素的转换很简单:px = dp * (dpi / 160)。例如,在240 dpi屏幕上,1 dp等于1.5物理像素。定义应用程序的UI时,应始终使用dp单位,以确保在具有不同密度的屏幕上正确显示UI。


3
因此,实际上没有必要执行任何代码吗?只需创建尺寸,应用程序将自动检查要应用的尺寸?
John R

1
+1:不要忘记,您可以使用布局来支持所有设备。
S.M_Emamian 2014年

1
@ S.M_Emamian对于平板电脑:1024X600(layout-large-mdpi)800X1280(layout-large-tvdpi)1200X1920(layout-large-xhdpi)1280X800(layout-xlarge-mdpi)2560X1600(layout-xlarge-xhdpi)请检查设备而不是模拟器。
Bhavesh Jethani 2014年

2
请同时检查以下链接可能对您有帮助。stackoverflow.com/questions/14151121/...
Bhavesh Jethani


28

首先,为不同的屏幕创建不同的value文件夹。然后根据res->values->dimens.xml文件中的屏幕大小将其放置在文件中,然后使用调用简单字体大小"@dimen/text_size"

res/values/dimens.xml    
res/values-small/dimens.xml    
res/values-normal/dimens.xml    
res/values-xlarge/dimens.xml

//for small    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">15sp</dimen>
</resources>

//for normal    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">20sp</dimen>
</resources>

//for large    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">30sp</dimen>
</resources>

//for xlarge    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">40sp</dimen>
</resources>

并按TextView如下所示检索字体大小。

<TextView
    android:id="@+id/lblHeader"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"           
    android:textSize="@dimen/text_size"
    android:textStyle="bold"
    android:typeface="serif" />

因此,您如何在此处为差异布局指定尺寸?例如您使用了任何比率(1:1.5:2:3:4)-(mdpi-hdpi:xhdpi:xxhdpi:xxxhdpi)-(2sp:3sp:4sp:6sp: 8sp)这样?我很困惑..!
Asif Sb 2015年

@AsifSb如果要按比例给出它,则必须以编程方式进行设置。否则,必须以静态方式将尺寸标注放入值文件夹中的不同diemens.xml中
PankajSharma 2015年

9

为了避免出现不同的屏幕分辨率和不同的密度的问题,我根据屏幕的宽度和高度百分比来调整大小和位置。如果根据屏幕的宽度或高度百分比调整文本大小,则字体在所有设备和所有分辨率上均为正确的大小。要根据其空间的宽度和高度获得正确的字体大小,只需使用此功能:

private float SetTextSize(String text, int width, int height)
{
    Paint paint = new Paint();
    float textWidth = paint.measureText(text);
    float textSize = (int) ((width / textWidth) * paint.getTextSize());
    paint.setTextSize(textSize);

    textWidth = paint.measureText(text);
    textSize = (int) ((width / textWidth) * paint.getTextSize());

    // Re-measure with font size near our desired result
    paint.setTextSize(textSize);

    // Check height constraints
    FontMetricsInt metrics = paint.getFontMetricsInt();
    float textHeight = metrics.descent - metrics.ascent;
    if (textHeight > height)
    {
        textSize = (int) (textSize * (height / textHeight));
        paint.setTextSize(textSize);
    }
    return textSize;
}

这是获取屏幕宽度和高度的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
{
    Point size = new Point();
    getWindowManager().getDefaultDisplay().getSize(size);
    screenWidth = size.x;
    screenHeight = size.y; 
}
else
{
    Display display = getWindowManager().getDefaultDisplay(); 
    screenWidth = display.getWidth(); 
    screenHeight = display.getHeight(); 
}

要获得所需的字体大小,只需根据屏幕宽度和屏幕高度组成一个区域,然后对其进行调整,直到字体大小看起来正确为止。一旦看起来正确,它就应该在所有设备上看起来正确。

float textSize = SetTextSize("text", (int) (screenWidth * 0.1), (int) (screenHeight * 0.15));

我希望这可以帮助你


1
重新“ ..百分比屏幕宽度/高度”。注意:此策略非常适合具有固定项目数的屏幕。在显示项目滚动列表的屏幕上,对于大型电话,我希望在“较大”和“显示更多行”之间进行折衷。一个可能的公式是将所有字体大小乘以sqrt(phoneWidthInches / defaultWidthInches),这defaultWidthInches是您设计的原始电话大小。因此,2倍大的手机将是1.4倍大的字体。(而不是适当地使用heightdiagonal公式)。重要请勿使用以像素为单位的宽度inches = pixels / dpi
制造商

8

基本上,您需要创建类似以下内容的文本样式:

<style name="CodeFont">
    <item name="android:textSize">30sp</item>
</style>

在此处了解更多信息http://developer.android.com/guide/topics/ui/themes.html

并使用Android对不同屏幕的支持指南在右侧的res文件夹中为不同屏幕创建所需的大小,如http://developer.android.com/guide/practices/screens_support.html中所述

旁注:我真的不知道您要在哪种情况下这样做,使用SP单位显示字体大小会缩放字体,使其在不同手机上看起来大致相同。


4

首先,您的应用程序设计需要一种分辨率。

示例:假设您的移动分辨率为380 * 480

       mobile screen width:380

       textView size is 80dp   
       Assume : if width is 380dp then 100 % then

               textview width 80dp then how many %(per).

            ower answer is: 25 %

使用Belove公式以编程方式查找屏幕尺寸

    DisplayMetric  displaymetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    ScreenHeight = displaymetrics.heightPixels;
    ScreenWidth = displaymetrics.widthPixels;
        txt_height = (int)((ScreenHeight*14.58)/100);
    txt_width = (int)((ScreenWidth*37.5)/100);


    LinearLayout.LayoutParams normal_param = new LinearLayout.LayoutParams(txt_height ,txt_width );

    txt_Name.setLayoutParams(normal_param);

我想给文本大小..对于不同的设备大小。
Bhavesh Jethani

@BhaveshJethani使用以上代码计算textsize百分比,请尝试使用该代码对我而言。
Hemantvc

3
我在说字体大小..不是textview大小
Bhavesh Jethani

3

我认为这是一个很好的答案:

文字大小和不同的Android屏幕大小

但是在这里,如何使用屏幕分辨率来做到这一点:

您可以为每个分辨率创建“值”资源目录,例如

values-wWIDTHp-hHEIGHTdp (you can also use values-wWIDTHp or values-hHEIGHTdp)
for example: 320*480 will be values-w320p-h480dp

在每个目录(包括默认值目录)中,创建一个名为“ dimens.xml”的文件,其内容为:

 for exmaple (the value related to the resolution):
 <dimen name="def_font_size">10sp</dimen>

现在,您可以使用“ @ dimen / def_font_size”或在默认值目录中创建样式。

将此添加到“ styles.xml”中:

<style name="FontSize">
    <item name="android:textSize">@dimen/def_font_size</item>
</style>

1

我创建了一个函数,可以根据屏幕大小将dp的大小转换为大小,并且对我来说效果很好。任何人根据屏幕的文字大小有问题都应该尝试一下。

public float convertFromDp(int input) {
    final float scale = getResources().getDisplayMetrics().density;
    return ((input - 0.5f) / scale);
}

简单地将其给定的值以编程方式赋予文本视图大小,如下所示

tvTextView1.setTextSize(convertFromDp(24));

这个答案对我有用。减少工作量和计算
Ranjith Kumar

1

为了获得nexus 6设备的支持,请创建drawable-560dpi文件夹并将所有图像放入其中。


我认为创建这样的特定布局不是必需的,而且很好,但是drawable-xxxhdpi会更加容易和有用
Abhilash

它不会为联系6。因为nexus 6具有560dpi的分辨率。如果未声明560dpi文件夹,则它将使用xxxhdpi文件夹的图像。
阿南德·萨瓦尼

是的,为了简单起见,我不建议单独指出联系6。图像不会有太大差异,因此xxxhdpi更容易。
Abhilash
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.