【问题标题】:How to use different background images for different resolutions in Android?如何在Android中为不同的分辨率使用不同的背景图片?
【发布时间】:2012-11-07 14:02:27
【问题描述】:

我正在为具有完整图像背景的 Android 平板电脑制作 Android 应用,但 我不能使用 9-patch ,所以我需要背景尽可能接近窗口大小。

我测试过的内容:

我已经使用drawable-ldpidrawable-mdpi 等文件夹进行了测试,但由于我希望图像适合窗口,所以效果不佳。

现在我正在尝试使用 drawable-wxxxdp 文件夹来获得尺寸与实际窗口尺寸接近的图像。

所以我有这个文件夹结构(每个文件夹都有不同的图像,即:不同文件夹上相同大小的图像不同):

drawable-w800dp-mdpi // 800x600px image
drawable-w800dp-hdpi // 800x600px image
drawable-w1024dp-mdpi // 1024x600px image
drawable-w1024dp-hdpi // 1024x600px image
drawable-w1280dp-mdpi // 1280x800 image
drawable-w1280dp-hdpi // 1280x800 image
drawable-w1280dp-xhdpi // 1280x800 image

问题是当我在不同的平板电脑上测试应用程序时它并不总是从预期的文件夹中获取图像

例如:在 1280x800 像素和 160 dpi 的平板电脑中,报告(使用DisplayMetrics窗口大小为 1280x752,它使用来自 @ 的 1280x800 像素图像987654333@ 文件夹并从顶部和底部剪切一点图像。但在 1280x800 像素和 213dpis 平板电脑上 报告 窗口大小为 1280x736 它从 drawable-w800dp-hdpi...一个……

另一方面,如果我尝试使用类似 1024x600px 和 160dpis 的配置的模拟器,报告 窗口大小为 1024x552,它会从 drawable-w1024dp-hdpi 获取图像文件夹,但它将其缩小并在屏幕上居中所以我以非常图像周围的大边框结束

文件:

我正在使用的测试布局是:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/appBackground"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="center"
        android:src="@drawable/background_image"
        tools:ignore="ContentDescription" />

</RelativeLayout>      

在我的清单文件中,我有:

<uses-sdk
    android:minSdkVersion="13"
    android:targetSdkVersion="15" />

<supports-screens 
android:anyDensity="true" 
android:largeScreens="true"
android:normalScreens="true" 
android:smallScreens="true"
android:resizeable="true"/>

更新: 我的活动代码:

public class ScreenTest extends Activity {

   private int width;
   private int height;
   private int dpis;
   private String sdpis;

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Ask for a full screen window
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
              WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_screen_test);
  }

    /* (non-Javadoc)
    * @see android.app.Activity#onCreateView(java.lang.String, android.content.Context, android.util.AttributeSet)
    */
   @Override
   public View onCreateView(String name, Context context, AttributeSet attrs) {
      return super.onCreateView(name, context, attrs);
   }

   /* (non-Javadoc)
    * @see android.app.Activity#onStart()
    */
   @Override
   protected void onStart() {
      // TODO Auto-generated method stub
      super.onStart();
      // Get the info about the screen
      Display display = getWindowManager().getDefaultDisplay();
      width = display.getWidth();// size.x;
      height = display.getHeight();
      DisplayMetrics outMetrics = new DisplayMetrics();
      display.getMetrics(outMetrics);
      dpis = outMetrics.densityDpi;
      sdpis = "";

      switch (dpis) {
         case DisplayMetrics.DENSITY_DEFAULT:
               sdpis = "160";
               break;
         case DisplayMetrics.DENSITY_HIGH:
            sdpis = "240";
            break;
         case DisplayMetrics.DENSITY_LOW:
            sdpis = "120";
            break;
         case DisplayMetrics.DENSITY_XHIGH:
            sdpis = "320";
            break;
         default:
            sdpis +=dpis;
            break;
      }
      Log.d("DPIs", "dpis: " + dpis + " sdpis: " + sdpis + " width: " + width + " height: " + height);

   }

   @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_screen_test, menu);
        return true;
    }
}                 

总结:

所以我不知道如何预测 App 将从哪个文件夹中获取图像?以及 它将如何处理?(缩放、裁剪...)

额外背景:

android-resoruces标签上的所有问题我都查过了,官方文档也看了好几遍:

还有一些相关的问题:

更新:修复了文件夹名称中的拼写错误。

【问题讨论】:

  • 为什么不在你的JAVA代码中处理?
  • 按照@Guna 的要求添加了活动代码。

标签: android android-layout android-resources android-resolution


【解决方案1】:

如果您想针对特定设备。或介于两种分辨率之间的所有设备,那么您必须先找到设备的宽度。像这样

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

之后,您可以制作带有宽度条件的 if 语句,并为不同的屏幕尺寸制作不同的布局。这不是推荐的方法,但在某些情况下效果很好

    if(width>=750)
      {
          setContentView(R.layout.screen_blue_heigh);
      }
   else if(width>=500&&width<750)
      {
          setContentView(R.layout.screen_blue_heigh);
      }
   else if(width<500&&width>=330)
      {
              setContentView(R.layout.screen_blue_medium);
      }
   else if(width<320)
       {
          setContentView(R.layout.screen_blue_low);
       }

希望这会对你有所帮助。

【讨论】:

    【解决方案2】:

    你是对的,它会从 w800dp 中选择资源,因为你是在纵向模式下运行的。

    当屏幕的方向在横向和纵向之间切换时,系统对应的宽度值会发生变化,以反映您的 UI 可用的当前实际宽度。

    使用res/drawable-sw600dp

    当屏幕方向改变时,设备的最小宽度不会改变。

    【讨论】:

    • 应用程序在横向模式下运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多