Android開発画面の適応

ご存じのとおり、Androidモデルにはさまざまなサイズがあるため、画面の調整はAndroid開発の非常に重要な部分になっています。一部の開発者はAndroid画面の適応に遭遇する可能性があります。今日画面適応を共有しましょう。Android画面の適応も非常に簡単であることがわかります。

基本概念

Android画面の適応で理解する必要があるいくつかの概念は退屈かもしれませんが、格言が言うように、「仕事で上手になりたいのは最初に鋭い武器でなければならない」であり、これは「あなたが持っている銃の種類は、あなたが持っている銃の種類を決定します「鳥」、これらの概念を理解すると、画面の調整は自然に楽になります。

  • px

それは英語の単語のピクセルの略語です。つまり、ピクセルは画面上のポイントを意味します。通常480X800などの解像度と呼ばれるものは、ピクセルを指します。

設計の分野では、ピクセルはデジタル画像の計算に使用される最小単位です。コンピューターに表示される画像は、連続した線で構成されているのではなく、肉眼では見えない多くの小さな点で構成されています。画像を数回拡大すると、これらの連続階調は、実際には同じような色の小さなドットで構成されていることがわかります。これらの小さなドットは、画像を構成する最小単位の「ピクセル」です。最小の独立した表示単位であるため、pxは整数なので、0.5pxは表示されません。といった:

このカラフルなLEDライトを見てください(元のサイズ)

これが彼の本当の色だと想像できますか?(ズームイン後)

画面の物理的なサイズであるインチを表します。1インチは2.54センチメートルに相当します。たとえば、私たちがよく話している携帯電話の画面サイズは5(英語)インチで、4(英語)インチはこのユニットを指します。これらの寸法は、画面の対角線の長さです。携帯電話の画面が4インチの場合、携帯電話の画面(表示可能領域)の対角線の長さが4 X 2.54 = 10.16 cmであることを意味します。

  • dpi

dpiは、1インチあたりのドット数、1インチあたりのドット数、つまり1インチあたりのピクセル数です。たとえば、解像度320X480の携帯電話は幅2インチ、高さ3インチです。各インチに含まれるピクセル数は320/2 = 160dpi(水平)または480/3 = 160dpi(垂直)です。160はこの携帯電話のdpiです。ほとんどの携帯電話の画面は正方形のピクセルを使用しているため、水平値と垂直値は同じです。

  • 密度

画面密度、密度とdpiの関係は密度= dpi / 160

  • dp

画面密度がdpi = 160、1dp = 1pxの画面でのディップ、デバイス非依存ピクセルの省略形、デバイス非依存ピクセル、Androidに固有の単位。

  • sp

dpと同様に、通常はフォントサイズを設定するために使用されますが、dpとの違いは、ユーザーのフォントサイズの設定に従ってスケーリングできることです。

Androidドローアブル

新しいAndroidプロジェクトを作成すると、さまざまなdpiに対応する多くのドローアブルフォルダーが表示されます。

  • drawable-ldpi(dpi = 120、density = 0.75)

  • ドローアブルmdpi(dpi = 160、密度= 1)

  • drawable-hdpi(dpi = 240、density = 1.5)

  • drawable-xhdpi(dpi = 320、density = 2)

  • ドローアブルxxhdpi(dpi = 480、密度= 3)

市場に出回っているほとんどのAndroidチュートリアルは、dpiごとに一連の画像リソースを教えています。これは確かに解決策ですが、アートやデザインに多くを追加する非常に愚かな方法でもあります。ワークロードは言うまでもなく、apkパッケージも非常に大きくなります。では、デザインリソースを最小限に抑えながら画面の適応を確実にする良い方法はありますか?同時に、dpi画像リソースのセットのみを使用するのが最善ですか?次のプロジェクトでまとめた方法を説明しましょう。

まず、自動レンダリングの概念について明確にする必要があります。AndroidSDKは、レンダリング用の画面サイズに対応するリソースファイルを自動的に選択します。SDKが携帯電話のdpiが160であることを検出すると、まず対応する画像リソースを見つけるために、drawable-mdpiフォルダーに移動します。まず、携帯電話のdpiが160であると仮定しますが、xhpdiフォルダーには対応する画像リソースファイルしかなく、プログラムは正常に実行できます。したがって、理論的には、1つの仕様の画像リソースのみを提供することは問題ありません。ldpi仕様の画像のみが提供される場合、画像が大きな解像度の携帯電話用に拡大されるかどうかが不明確になるため、サポートする必要がある最大のセットを提供する必要があります。 dpi画像。ユーザーの携帯電話の解像度が小さい場合でも、縮小しても画像は非常に鮮明です。

xhdpiが最初の選択になる

上面说了只需要提供一套大的dpi的图片就ok了,现在市面手机分辨率最大可达到1080X1920的分辨率,如Nexus5,dpi属于xxhdpi,但是毕竟还没普及,目前市面上最普遍的高端机的分辨率还多集中在720X1080范围,也就是多集中在xhdpi,所以目前来看xhpdi规格的图片成为了首选。当然随着技术规格的提高以后发展,以后可能市场上xxdpi的手机会越来越普遍,但这是后话。

设计资源紧张怎么办?

在现在的App开发中,基本都会有iOS和Android版本,有些公司为了保持App不同版本的体验交互一致,还有些公司的设计资源可能比较紧张,这些情况下iOS和Android版本基本是一个设计师主导,而大多数情况下设计师可能更会以iPhone手机为基础进行设计,包括后期的切图之类的。这个时候身为Android开发人员你是否还要求设计师单独为Android端切一套图片资源呢?这会让你们的设计师崩溃的,下面就来告诉一个项目中总结的更棒的方法。

相信设计师们一般都会用最新的iPhone5(5s和5的尺寸以及分辨率都一样)来做原型设计,而iPhone5的屏幕分辨率为640X1164, 屏幕尺寸为4英寸,根据勾股定理(a^2 + b^2 = c^2)640^2+1164^2=1764496, 然后再对其开根号可求出屏幕对角线的分辨率为:1328,除以4可得出iphone5的dpi:1328/4≈332 可以看出iPhone5的屏幕的dpi约等于320, 刚好属于xhdpi,所以你可以很自豪的像你们的设计师说不用专门为Android端切图,直接把iPhone的那一套切好的图片资源放入drawable-xhdpi文件夹里就ok了。

wrap_content VS dp

wrap_content和dp都是在Android开发中应该经常用到的,然后它们冥冥中是有关系的。

假设你看了这篇文章后都是统一有xhdpi的资源,那么你用wrap_content完全没有问题,Android会自动为其他规格的dpi屏幕适配,比如你在xhdpi放了一张120X120px大小的图片,那么在在hdpi屏幕上显示的就只有120/2*1.5=90px大小,但是如果你不小心同样把这张图片也放入了mdpi了,这个时候用wrap_content显示就会有问题,具体看下面的例子:

例如假设你只在drawable_xhdpi文件夹下放了test图片,xhdpi的设备会去xhdpi文件夹下找到test图片并直接显示,而mdpi的设备优先会去mdpi文件夹里查找test图片,但是没找到,最后在xhdpi文件夹下找到,然后会自动根据density计算并缩放显示出来,实际显示出来的大小是120/2=60px, 所以整体的显示比例才会看起来比较正常

  • mdpi

  • xhdpi

但是如果你在mdpi文件夹里也放入了同样的图片,那么mdpi的设备会直接去mdpi文件夹里寻找到test图片,并直接显示,而这时候显示不会缩放,实际显示大小就是120X120,在mdpi的屏幕上看起来就会比较大,如图:

通过上面整个过程,大家应该理解了Android加载资源的整个过程, wrap_content同样可以用dp来代替,就拿上面这个例子,在xhdpi文件夹内放入了一张120X120像素的test图片,宽高直接除density就得出dp的数值,即这种情况下以下代码是等同的.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/test" />
<ImageView
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:src="@drawable/test" />

总结

相信通过以上的讲解,对Android UI中的一些基本概念有个很好的理解,实际开发工作中也有一些高效的方法可以参考,应该可以应对大部分的屏幕适配工作。但是项目中仍然有一些比较特殊的适配需求满足不了,以后会针对一些特殊的需求进行示例讲解。

おすすめ

転載: blog.csdn.net/xhf_123/article/details/49931547