你好,我是android程序的新手,所以我想知道:
如何使用可绘制以兼容所有屏幕大小(idpi、mdpi、hdpi、xhdpi、xhdpi)
实际上,我对可绘制屏幕大小与所有屏幕大小的兼容性感到困惑。
所以我想知道:
如果我想让我的应用程序与所有屏幕尺寸兼容,我需要在每个可绘制文件夹中放置图像吗?
例如:背景图像
或者我可以对所有屏幕尺寸使用一个相同的图像。
发布于 2014-03-20 02:31:27
您不需要在每个可能的drawable
文件夹中创建图像。只提供一个图像并将其放入drawable
文件夹就足够了。根据您的使用情况,此图像将自动缩放。
然而,这并不能在所有屏幕上提供良好的质量,而且计算(缩放)的成本可能会更高。建议为不同屏幕密度(例如drawable-mdpi
、drawable-hdpi
等)提供单独的图像。他们的想法是,他们应该有与屏幕密度相匹配的不同分辨率。
发布于 2014-03-20 02:51:19
只有当你为每一个dpi提供绘图时,你的图像才会显得尖锐和清晰。ldpi不再受支持,因此您可以忽略Ldpi。
另外,对于您的启动程序图标,提供一个xxxhdpi映像。平板电脑在Kit Kat上运行,带有全高清屏幕,在发射器中使用这些图像。
创建一个可绘图并将其放入drawable
文件夹是错误的做法!你的图像会很模糊。
发布于 2015-03-09 00:39:35
我有一个很好的方法来对付这种情况,就像一种魅力。您只需要为您创建一个高清映像,而不是方法解决一切。
以下是一种方法:
/**
* Get DRAWABLE with original size screen resolution independent
* @param is Input stream of the drawable
* @param fileName File name of the drawable
* @param density Density value of the drawable
* @param context Current application context
* @return Drawable rearranged with its original values for all
* different types of resolutions.
*/
public static Drawable getDrawable(InputStream is, String fileName, int density, Context context) {
Options opts = new BitmapFactory.Options();
opts.inDensity = density;
opts.inTargetDensity = context.getResources().getDisplayMetrics().densityDpi;
return Drawable.createFromResourceStream(context.getResources(), null, is, fileName, opts);
}
在这里,您必须为您的图像文件准备inputstrem,并在您的任何使用区域设置一个对您的屏幕有益的密度。密度越小,质量越低,通过改变数值来解决。下面是使用该方法的一些示例:
1)从“资产”文件夹中打开资产:
getDrawable(assetManager.open("image.png"), "any_title", 250, context)
2)打开“可绘制”文件夹:首先,必须向您的输入流提供以下方法: a)方法:
/**
* Get InputStream from a drawable
* @param context Current application context
* @param drawableId Id of the file inside drawable folder
* @return InputStream of the given drawable
*/
public static ByteArrayInputStream getDrawableAsInputStream(Context context, int drawableId) {
Bitmap bitmap = ((BitmapDrawable)context.getResources().getDrawable(drawableId)).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] imageInByte = stream.toByteArray();
return new ByteArrayInputStream(imageInByte);
}
和用法: b)用法:
getDrawable(getDrawableAsInputStream(getBaseContext(), R.drawable.a_drawable), "any_title", 250, context)
我希望这是有用的。
https://stackoverflow.com/questions/22530001
复制