【问题标题】:Different resolution support android不同分辨率支持安卓
【发布时间】:2013-05-18 08:23:15
【问题描述】:

已编辑问题:

移动分辨率:
我想设计不同的屏幕 dpi,例如以下分辨率。
320x480,
480×800,
540x960,
720x1280 (Samsung S3),
1080x1920 (S4, Nexus5,Nexus 5x, Moto G4),
2560 x 1440 (Nexus 6、Nexus 6p、三星 edge)

平板电脑分辨率:
480x800 (micromax) ,
600x1024 (samsung tab2),
800x1280 (nexus 7),
1200x1920(新关系 7),
2048x1536(关系 9)

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

Q1) best 解决这个problem 的方法是什么?

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

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

Q4) 不同分辨率的应用程序启动器图标大小?

【问题讨论】:

  • 屏幕分辨率无关紧要。屏幕密度很重要。
  • 看看 [this SO answer][1] 并尝试您的代码。 [1]:stackoverflow.com/questions/9877946/…
  • 请不要再用琐碎的修改来冒犯您的问题。如果这种情况继续下去,我们将锁定问题。
  • @Sotti:屏幕尺寸!= 屏幕分辨率。
  • @Sotti:如果您阅读我的评论,您会注意到我写的屏幕分辨率无关紧要。我没有写屏幕大小无关紧要。

标签: android android-custom-view android-xml android-drawable screen-resolution


【解决方案1】:

首先为一个分辨率设计应用程序。

示例:假设您的手机分辨率为 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);

【讨论】:

  • 我想为不同的设备大小提供文本大小。
  • @BhaveshJethani 使用上面的代码计算文本大小百分比,试试它的代码对我有用。
  • 我说的是字体大小.. 不是 textview 大小
【解决方案2】:

基本上你需要创建一个类似这样的文本样式:

<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 单位的字体大小会缩放字体,使其在不同的手机上看起来或多或少相同的大小。

【讨论】:

    【解决方案3】:

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

    Text size and different android screen sizes

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

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

    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>
    

    【讨论】:

      【解决方案4】:

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

      手机分辨率

      • 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)
      

      绘图文件夹:

      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,Samsung 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. 参考Supporting Multiple Screens

      2. 请参阅 Google IO Pdf 的第 77 页了解设计device density。在那里,您将找到针对不同设备处理dimens.xml 的方法。

      3. Nexus 6 and Nexus 9 准备好您的应用程序。

      摘自Supporting Multiple Screens:

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

      【讨论】:

      • 那么真的不需要实现任何代码吗?只需创建尺寸,应用程序就会自动检查要应用的暗淡?
      • +1 : 别忘了你可以通过布局支持所有设备。
      • @S.M_Emamian 对于平板电脑:1024X600 (layout-large-mdpi) 800X1280 (layout-large-tvdpi) 1200X1920 (layout-large-xhdpi) 1280X800 (layout-xlarge-mdpi) 2560X1600 (layout-large-mdpi) -xlarge-xhdpi) 请签入设备而不是模拟器。
      • 请检查下面的链接可能对你有帮助。 stackoverflow.com/questions/14151121/…
      【解决方案5】:

      首先您为不同的屏幕创建不同的值文件夹。并根据屏幕放置大小 在res-&gt;values-&gt;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) 像这样?我很困惑..!
      【解决方案6】:

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

      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));
      

      希望对你有帮助

      【讨论】:

      • Re ".. 屏幕宽度/高度百分比"。注意:对于具有固定数量项目的屏幕,此策略完美;在显示项目滚动列表的屏幕上,对于大型手机,我更喜欢“更大”和“显示更多行”之间的折衷。一个可能的公式是将所有字体大小乘以sqrt(phoneWidthInches / defaultWidthInches),其中defaultWidthInches 是您设计的原始手机大小。所以 2 倍大的手机将是 1.4 倍大的字体。 (改为酌情使用heightdiagonal 公式)。 重要提示请勿使用像素宽度inches = pixels / dpi.
      【解决方案7】:

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

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

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

      tvTextView1.setTextSize(convertFromDp(24));
      

      【讨论】:

      • 这个答案对我有用。减少工作量和计算
      【解决方案8】:

      对于nexus 6设备支持,创建drawable-560dpi文件夹并将所有图像放入其中。

      【讨论】:

      • 我认为制作这样的特定布局没有必要也很好,但是 drawable-xxxhdpi 会更容易和有用
      • 它不适用于 nexus 6 。因为 nexus 6 的分辨率为 560dpi。如果您没有声明 560dpi 文件夹,它将使用 xxxhdpi 文件夹的图像。
      • 是的,为了让它变得简单,而不是单独指出 nexus 6,我建议这样做。图像不会有太大差异,因此 xxxhdpi 更容易。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      相关资源
      最近更新 更多