我正在开发一个关于android version2.2的程序。我已经阅读了很多关于支持多种屏幕尺寸的文档但仍然感到困惑我设计了一个支持大屏幕和普通屏幕的布局文件,当我尝试使用小屏幕时,它不会调整布局以适应屏幕。我也在清单中使用了这段代码。
<supports-screens
android:resizeable="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true"
/>
小屏幕的图像是here.如何设置与小屏幕兼容的屏幕?在某处我通过使用文件夹“layout-small”找到了,但是如果我使用它,项目大小正在增加,我不希望这样,那么任何人都可以建议我这样做的最佳方法吗?
请仔细阅读以下链接。这些可能会帮助你:
Supporting Different Screen Sizes
Supporting Different Densities
Supporting Tablets and Handsets
AFAIK,支持所有屏幕的唯一方法是通过做文件夹分叉。每个XML文件都高达几千字节。因此,尺寸不应该是一个问题。
所有屏幕的解决方案并支持所有布局。
图标:
mdpi hdpi xhdpi xxhdpi xxxhdpi
Launcher Icons (App Icons) 48 x 48 72 x 72 96 x 96 144 x 144 192 x 192
Action Bar,Toolbar,Tab Icons 24 x 24 36 x 36 48 x 48 72 x 72 96 x 96
Notification Icons 24 x 24 36 x 36 48 x 48 72 x 72 96 x 96
背景图像分辨率:
ldpi: Portrait: 240 X 320px. Landscape: 320 X 240px.
mdpi: Portrait: 320 X 480px. Landscape: 480 X 320px.
hdpi: Portrait: 480 X 800px. Landscape: 800 X 480px.
xhdpi: Portrait: 640 X 960px. Landscape: 960 X 640px.
xxhdpi: Portrait: 960 X 1600px. Landscape: 1600 X 960px.
xxxhdpi: Portrait: 1280 X 1920px. Landscape: 1920 X 1280px.
可绘制文件夹:
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).
ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi
布局:
Portrait:
res/layout/main_activity.xml # For handsets (smaller than 600dp available width)
res/layout-large/main_activity.xml # For small tablets (640dp x 480dp and bigger)
res/layout-xlarge/main_activity.xml # For large tablets (960dp x 720dp and bigger)
res/layout-w600dp/main_activity.xml # For 7” tablets or any screen with 600dp
# available width (possibly landscape handsets)
Landscape:
res/layout-land/main_activity.xml # For handsets in landscape
res/layout-sw600dp-land/main_activity.xml # For 7” tablets in landscape
参考链接:
Different resolution support android
https://developer.android.com/guide/practices/screens_support.html
https://design.google.com/devices/
Is there a list of screen resolutions for all Android based phones and tablets?
是的,我已经找到了解决问题的方法,你是对的我个人认为为每个屏幕分辨率制作布局都需要时间,并使你的项目规模变大。
为了使布局适合所有屏幕分辨率,我已经实现了我自己的技术,即以百分比设置宽度和高度
问题出现时,我们设置Views/Layouts
与一些恒定的宽度或高度值让我们说100dp
。
解决方案非常简单,尝试使用match_parent
,以便视图填充空白空间或使用weight
并定义每个View
相对于其他Views
这将有助于您的布局几乎在每个屏幕分辨率和运行时设置只有那些LayoutParams
的Views/Layouts
根据百分比,它具有一些恒定的宽度或高度。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:id="@+id/mLayout"
android:layout_width="280px"
android:layout_height="300px" />
</RelativeLayout>
注意:我已经将px用于固定大小的布局的宽度/高度,因为在LayoutParams layoutParams = new LayoutParams(int width, int height);
中,width
和height
将值作为像素
这是一个示例代码
final ViewTreeObserver mLayoutObserver = mLayout.getViewTreeObserver();
mLayoutObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
DisplayMetrics metrics = getResources().getDisplayMetrics();
int deviceWidth = metrics.widthPixels;
int deviceHeight = metrics.heightPixels;
float widthInPercentage = ( (float) 280 / 320 ) * 100; // 280 is the width of my LinearLayout and 320 is device screen width as i know my current device resolution are 320 x 480 so i'm calculating how much space (in percentage my layout is covering so that it should cover same area (in percentage) on any other device having different resolution
float heightInPercentage = ( (float) 300 / 480 ) * 100; // same procedure 300 is the height of the LinearLayout and i'm converting it into percentage
int mLayoutWidth = (int) ( (widthInPercentage * deviceWidth) / 100 );
int mLayoutHeight = (int) ( (heightInPercentage * deviceHeight) / 100 );
LayoutParams layoutParams = new LayoutParams(mLayoutWidth, mLayoutHeight);
mLayout.setLayoutParams(layoutParams);
}
});
我想这个代码几乎是自我解释的,如果任何人仍然需要帮助,你可以马上问
结论:如果需要为Views/Layouts
设置一些恒定的宽度/高度,请始终在布局文件(即xml)中的px中设置值,然后以编程方式设置LayoutParams
。
建议:我认为Google Android Guys应该认真考虑将dp/dip
单位替换为percentage
。
现在支持不同的屏幕尺寸更容易!使用新尺寸单位SDP。
SDP - 可扩展的大小单元
一个提供新大小单元的android SDK - sdp(可扩展的dp)。此尺寸单位随屏幕尺寸而变化。它可以帮助Android开发人员支持多个屏幕。
对于文本视图,请参阅ssp,它基于文本的sp大小单位。
可扩展DP(sdp)是最佳解决方案。它将调整小部件的大小取决于屏幕大小。我们也可以将其应用于不同文字大小的文本。
要将sdp添加到项目中(使用Android Studio和Gradle):
将实现'com.intuit.sdp:sdp-android:1.0.5'添加到build.gradle依赖项块中。
for example:
dependencies {'com.intuit.sdp:sdp-android:1.0.5' }
试试这个
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:src="@drawable/myimage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
尝试使用layout_weight他们会有所帮助。 :)
我不确定解决方案,但我希望与您分享将在任何地方工作,它涵盖了大部分领域。
我通过使用LinearLayout
划分屏幕并定义其方向(水平或垂直)来解决这个问题,layout_weightsum = 3
(3是将屏幕划分为3个部分)。
然后在根线性布局中,我再次使用LinearLayout
与layout_height = "0dp"
(如果你想要垂直分区,否则layout_height = "wrap_content"
,如果你需要水平然后制作layout_width = "0dp"
和layout_weight =1
(1是屏幕的1部分,你也可以把值放在浮动状态1.2)。
可以试试这对我有帮助,也许希望对你有帮助。