【发布时间】:2012-11-07 14:02:27
【问题描述】:
我正在为具有完整图像背景的 Android 平板电脑制作 Android 应用,但 我不能使用 9-patch ,所以我需要背景尽可能接近窗口大小。
我测试过的内容:
我已经使用drawable-ldpi、drawable-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标签上的所有问题我都查过了,官方文档也看了好几遍:
还有一些相关的问题:
- How to findout the best match
- Android resources “best match” fallback logic
- Dynamic Bitmap drawable in android
- Why Android uses resources from the higher resource instead of a lower?
更新:修复了文件夹名称中的拼写错误。
【问题讨论】:
-
为什么不在你的JAVA代码中处理?
-
按照@Guna 的要求添加了活动代码。
标签: android android-layout android-resources android-resolution