在Android中处理不同屏幕分辨率的背景图像

jvlzgdj9  于 2022-12-31  发布在  Android
关注(0)|答案(3)|浏览(157)

我的Android应用程序(一款基于文本的游戏)大量使用背景图像,以提供更好的视觉氛围。例如,如果游戏中的动作带你进入一家酒馆,那么你会在游戏中得到一张酒馆的背景图像。这是一个巨大的改进,在图形上,比你否则会得到的无聊的黑色背景。
然而,这也是一个问题,因为android:background总是拉伸到屏幕的尺寸。结果是,如果播放器在纵向和横向模式之间切换,背景图像看起来非常糟糕。更糟糕的是,许多设备有非常不同的宽高比(例如,320 x480 mdpi,480 x800 hdpi,和480 x852 hdpi),甚至更多的变化即将到来。
其他人是如何解决这个问题的呢?对我来说,拥有主分辨率/方向的单独图像不是一个选择,因为这会导致APK变得太大。

ogq8wdun

ogq8wdun1#

第一步是获取设备本身的屏幕高度和宽度,然后根据需要拉伸/收缩或填充位图。这个SO答案有源代码,应该会有帮助,复制如下。支持Josef为原始答案。

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();

下面是获取方向的通用源代码。

int orientation = display.getOrientation();

或者来自X1 E1 F1 X的一些更复杂的源代码(有点乱,但看起来正确)。

public int getscrOrientation()
{
  Display getOrient = getWindowManager().getDefaultDisplay();

  int orientation = getOrient.getOrientation();

  // Sometimes you may get undefined orientation Value is 0
  // simple logic solves the problem compare the screen
  // X,Y Co-ordinates and determine the Orientation in such cases
  if(orientation==Configuration.ORIENTATION_UNDEFINED){

      Configuration config = getResources().getConfiguration();
      orientation = config.orientation;

      if(orientation==Configuration.ORIENTATION_UNDEFINED){
        //if height and widht of screen are equal then
        // it is square orientation
            if(getOrient.getWidth()==getOrient.getHeight()){
            orientation = Configuration.ORIENTATION_SQUARE;
            }else{ //if widht is less than height than it is portrait
      
                if(getOrient.getWidth() < getOrient.getHeight()){
                orientation = Configuration.ORIENTATION_PORTRAIT;
                }else{ // if it is not any of the above it will defineitly be landscape
                orientation = Configuration.ORIENTATION_LANDSCAPE;
                }
            }
       }
  }
  return orientation; // return value 1 is portrait and 2 is Landscape Mode
}
hfwmuf9z

hfwmuf9z2#

我建议你得到你当前视图的宽度和高度。现在我不确定什么函数会给予你这些值,但我相信这是可能的。有了它,你就可以计算一个长宽比。我会让图像像1000x1000,只是显示图像的某个部分,这样长宽比就不会错了。
我的相机也有同样的问题。所以我的解决方案是从两个值中选择一个,宽度或高度,作为固定值,然后根据纵横比计算正确的另一个值。我不确定是否已经有函数可以只显示图像的一部分,但我相信你可以写一些东西来复制图像的一部分并显示那部分。
当然,缺点是你只会显示背景的一部分。由于手机的宽高比一般在1:1.3到1:1.8之间,我想这不会是一个太大的问题。我个人宁愿以正确的方式看到图像的一部分,而不是看一个丑陋的拉伸图像。

rnmwe5a2

rnmwe5a23#

也许你可以创建你的背景图像作为NinePatch图像,以便您在更好地控制它如何伸展?
否则,您可以通过设置scaleType属性(例如android:scaleType="center")来防止图像拉伸(或至少保持正确的纵横比)。

相关问题