Android图片与屏幕适配问题

Android程序要在不同尺寸的手机上运行,界面常常变形,有没有什么好的办法可以使程序适应不同尺寸的手机,图片又可以保持原样。

       

hdpi:   72 x 72

mdpi:  48 x 48

ldpi:    36 x 36

在一些解压出的apk包里面,一般ldpi都仅有一个图片,hdpi和mdpi中各有一套。google:在ldpi的手机屏幕上,hdpi中的图片可以按比例缩小一半来适应这种屏幕。

Android适配不同的设备

分为3个主题:http://developer.android.com/training/basics/supporting-devices/index.html

1.支持不同的语言

2.支持不同的屏幕screen

3.支持不同的平台版本Platform versions

 

 Android不同设备的屏幕通用属性:size尺寸,density像素密度。app可能安装到不同屏幕的设备上,所以为了优化app在不同屏幕设备上的外观效果,应该包含一些可选的资源。

  • 4种通用尺寸:small, normal, large, xlarge
  • 4种通用密度:low(ldpi),medium(mdpi),high(hdpi),extra high(xhdpi)

1.创建不同的layout

 

res/
      /layout/main.xml
      /layout-large/main.xml

默认是portrait(竖屏)

res/
      /layout/main.xml                      #default(portrait)
      /layout-land/main.xml              #landscape
      /layout-large/main.xml             #large(portrait)
      /layout-large-land/main.xml     #large landscape

不同的layout要放到不同的layout目录里面。

 

2.创建不同的Bitmap

提供不同的bitmap资源图来适配每一种密度(low,medium,high,extra-high)

  • xhdpi: 2.0
  • hdpi: 1.5
  • mdpi: 1.0(baseline)
  • ldpi: 0.75

更多内容请参考:http://developer.android.com/training/basics/supporting-devices/index.html

Designing for multiple screens

  • 1.supporting different screen sizes         支持不同屏幕尺寸
  • 2.supporting different screen densities  支持不同屏幕密度
  • 3.implementing adaptative UI flows        实现adaptative UI flows

 

1.支持不同尺寸的屏幕supporting different screen sizes

http://developer.android.com/training/multiscreen/screensizes.html#TaskUseOriQuali

1.1 Use "wrap_content" and "match_parent"

1.2 Use RelativeLayout

1.3 Use Size Qualifiers

1.4 Use the Smallest-width Qualifier

1.5 Use Layout Aliases

1.6 Use Orientation Qualifiers

1.7 Use Nine-patch Bitmaps

  • 确保你的layout可以适当的resize来适应屏幕
  • 根据屏幕的configuration提供合适的UI layout
  • 确保将准确的layout应用到正确的屏幕上
  • 提供可以准确缩放的bitmaps

要用"wrap_content" 和 "match_parent"

为保证你的layout灵活并可适应不同屏幕尺寸,在设置一些view components的宽度和高度你应该使用"wrap_content"和"match_parent"。如果你使用"wrap_content",view的宽度和高度将会被设置为必要的最小size在view的内部来适应内容,while "match_parent"(also known as "fill_parent" 在API level 8前)使component expand来填充它parent view的size.

使用"wrap_content"和"match_parent"的size代替hard-coded sizes,你的views分别只使用那个view需要的空间或expand以填充可用空间。比如:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout android:layout_width="match_parent" 
                  android:id="@+id/linearLayout1"  
                  android:gravity="center"
                  android:layout_height="50dp">
        <ImageView android:id="@+id/imageView1" 
                   android:layout_height="wrap_content"
                   android:layout_width="wrap_content"
                   android:src="@drawable/logo"
                   android:paddingRight="30dp"
                   android:layout_gravity="left"
                   android:layout_weight="0" />
        <View android:layout_height="wrap_content" 
              android:id="@+id/view1"
              android:layout_width="wrap_content"
              android:layout_weight="1" />
        <Button android:id="@+id/categorybutton"
                android:background="@drawable/button_bg"
                android:layout_height="match_parent"
                android:layout_weight="0"
                android:layout_width="120dp"
                style="@style/CategoryButtonStyle"/>
    </LinearLayout>

    <fragment android:id="@+id/headlines" 
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.HeadlinesFragment"
              android:layout_width="match_parent" />
</LinearLayout>

 

......

2.支持不同密度的屏幕supporting different screen densities

提供不同的资源、使用resolution-independent units of measurements

使用密度无关像素Use Density-independent Pixels

一个常见陷阱在设计layout的时候要避免使用绝对像素pixels来定义距离或尺寸。使用像素px定义会有个问题因为不同的屏幕有不同的像素密度,所以同样数量的像素值在不同的设备屏幕上会有不同的物理尺寸。因此当指定尺寸时,总要使用dp或sp这样的单位units。1 dp是density-independent pixel,在160dpi密度的设备中等同于1px。以sp是同样的单位unit,但是is scaled by the user's preferred text size(it's a scale-independent pixel),所以你应该使用这种度量单位when defining text size(但是never for layout size)。

例如,当指定两个views之间的spacing,要使用dp而非px:

<Button android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/clickme"
    android:layout_marginTop="20dp" />

 

当指定文字尺寸text size,总要用sp:

<TextView android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="20sp" />

 

Provide Alternative Bitmaps提供可选的Bitmaps

Since Android运行在各种各样的密度屏幕的设备商,你应该总能提供你的bitmap 资源tailored to each of the generalized density bucket:low,medium,high and extra-high density. This 将会帮助你在不同密度的屏幕上实现好的图像质量和效果。

要生成这种图片,你应该以vector格式生成每种密度对应图使用以下尺寸scale:

  • xhdpi:2.0
  • hdpi:1.5
  • mdpi:1.0(baseline)
  • ldpi:0.75

这意味着如果你要生成一个200x200的图for xhdpi设备,相应的要生成150x150 for hdpi,100x100 for mdpi ,75x75 for ldpi设备。

然后将这些图放到res下相应的子目录中,程序运行时系统会根据屏幕密度选择使用对应密度的图。

MyProject/
  res/
    drawable-xhdpi/
        awesomeimage.png
    drawable-hdpi/
        awesomeimage.png
    drawable-mdpi/
        awesomeimage.png
    drawable-ldpi/
        awesomeimage.png

任何时候,当你引用@drawable/awesomeimage,the system selects the appropriate bitmap based on the screen's dpi.

For more tips and guidelines for creating icon assets for your application, see the Icon Design Guidelines.

更多适配问题可以参考http://blog.csdn.net/moruite/article/details/7281428

 

图标尺寸的约定http://ticktick.blog.51cto.com/823160/1263366

http://developer.android.com/design/style/iconography.html#small-contextual

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值