【问题标题】:Multiple screen resolution [duplicate]多屏幕分辨率[重复]
【发布时间】:2011-08-23 05:45:03
【问题描述】:

我正在开发 320*480 的应用程序。如何让应用在 480*854 屏幕上运行?当我尝试在 480*854 屏幕上运行时,应用程序的原始设计看起来很小。我想为android中的每个屏幕创建单独的布局吗?如果是这样,请向我提供示例提示以继续。

【问题讨论】:

    标签: android screen-resolution


    【解决方案1】:

    我已经实现了自己的处理多个屏幕分辨率的方法。

    您当然可以通过在运行时根据百分比

    设置LayoutParams来避免这个问题

    问题只发生在Views/Layouts 具有一些恒定的宽度高度假设280dp。如果我们以百分比的形式以编程方式设置Views/Layouts的布局参数并且只使用常量widthheight,解决方案非常简单

    这是一个示例 xml

    <?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 用于固定大小的布局的 width/height,因为在 LayoutParams layoutParams = new LayoutParams(int width, int height); 中,widthheight将值作为像素

    这是一个以百分比设置widthheight的示例代码

    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;
    
                float heightInPercentage =  ( (float) 300 / 480 ) * 100;
    
                int mLayoutWidth = (int) ( (widthInPercentage * deviceWidth) / 100 );
    
                int mLayoutHeight = (int) ( (heightInPercentage * deviceHeight) / 100 );
    
                LayoutParams layoutParams = new LayoutParams(mLayoutWidth, mLayoutHeight);
    
                mLayout.setLayoutParams(layoutParams);
            }
        });
    

    现在可能有些人想知道这里发生了什么

    float widthInPercentage = ( (float) 280 / 320 ) * 100

    让我解释一下 280 是我的LinearLayout 的宽度,320 是我的设备屏幕的宽度(我正在开发),我目前知道我在分辨率为 320 x 480 的设备上进行测试,我正在做的是计算我的布局在 百分比方面覆盖了多少 区域强>然后

    int mLayoutWidth = (int) ( (widthInPercentage * deviceWidth) / 100 )

    我在这里根据屏幕分辨率计算我的布局的新宽度,这样您的Views/Layouts 在每个屏幕分辨率上看起来都完全相同。

    结论:如果您需要为您的Views/Layouts 设置一些恒定的宽度/高度,请始终在布局文件中的 px 中设置值(即xml),然后以编程方式设置LayoutParams

    Google Android 工程师的建议,我想你们应该认真考虑将dp/dip 单位更改为percentage

    【讨论】:

    • 你不会有很多可能的错误,因为这不适用于所有 android 设备,例如在 3-4 API 上运行的设备
    • @AkshatAgarwal 是的,上述解决方案已针对 Api 8 及更高版本进行了测试。
    【解决方案2】:

    为此,您可以参考设备的可用宽度和高度使布局动态化

    Display mDisplay= activity.getWindowManager().getDefaultDisplay();
    int width= mDisplay.getWidth();
    int Height= mDisplay.getHeight();
    

    根据播出信息大小设置您的布局

    【讨论】:

    • 为此,您必须为每种屏幕类型创建单独的可绘制对象
    • 是的,我尝试过类似的方法。但我不确定这种方法是否正确。因为我们必须为所有可用的屏幕创建单独的布局?这是我的代码: DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); ht = displaymetrics.heightPixels; wt = displaymetrics.widthPixels; if (ht == 240 && wt == 320) { setContentView(R.layout.timetable_ldpi); } else if (ht == 240 && wt == 400) { setContentView(R.layout.timetable_ldpi); }
    • 这个方法行得通,这取决于你如何实现它
    • 在这种方法中,我必须根据屏幕密度创建布局,只有设计视图必须更改?
    【解决方案3】:

    先生。巴巴尔,

    我认为你应该按照下面的公式而不是像这样计算

    float widthInPercentage =  ( (float) 280 / 320 )  * 100;
    float heightInPercentage =  ( (float) 300 / 480 ) * 100;
    int mLayoutWidth = (int) ( (widthInPercentage * deviceWidth) / 100 );
    int mLayoutHeight = (int) ( (heightInPercentage * deviceHeight) / 100 );
    

    我建议你按照以下方式进行:

    int baseWidth=320;
    int baseHeight=480;
    
    int mLayoutWidth = (int) ( (280* deviceWidth) / baseWidth);
    int mLayoutHeight = (int) ( (300* deviceHeight) / baseHeight);
    

    这也适用于视图而不是文本大小;

    【讨论】:

      【解决方案4】:

      在 Android 中,您不会追求绝对分辨率,而是关注屏幕密度。 是的,您可能需要创建不同的布局来支持各种密度和屏幕尺寸。一般来说,Android 支持四种密度(低、中、高、超高)

      我建议您阅读适用于 Android 的 Supporting Multiple Screens。我认为它会帮助你实现你需要做的事情。它包含有关设计替代布局和可绘制对象的各个部分以及与支持多种屏幕分辨率相关的其他有用信息。

      【讨论】:

      • 感谢您的所有回答。
      【解决方案5】:

      您好,欢迎来到堆栈溢出...
      从 1.6 版开始,Android 支持多种屏幕分辨率和密度,分为三类:

      • 小:屏幕尺寸小于 T-Mobile G1 或三星 I7500 的设备,例如 HTC Tattoo
      • 正常:屏幕尺寸与 G1 或 I7500 大致相同的设备。
      • 大:屏幕尺寸大于 G1 或 I7500 的设备(例如平板式设备。)

      开发人员可以使用 Android 框架 API 和 SDK 中引入的工具来控制应用是否以及如何出现在每个组中的设备上。有关实现的详细信息,请参阅 Android 开发指南文章 Supporting Multiple Screens。你可以参考这个链接MultiResolution

      或者可以使用

      Display displayparm= activity.getWindowManager().getDefaultDisplay();
      int width= displayparm.getWidth();
      int Height= displayparm.getHeight();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多