是否可以从资产文件夹中加载可绘制对象?
Posted
技术标签:
【中文标题】是否可以从资产文件夹中加载可绘制对象?【英文标题】:Is it possible to load a drawable from the assets folder? 【发布时间】:2011-06-20 13:41:46 【问题描述】:你能从assets
(不是drawable文件夹)文件夹中的子目录加载drawable吗?
【问题讨论】:
【参考方案1】:希望得到帮助:
Drawable d = Drawable.createFromStream(getAssets().open("Cloths/btn_no.png"), null);
【讨论】:
只是想知道,文件是否为您自动关闭?为了安全起见,我目前给一个变量 open() 的返回值,然后手动关闭它。 @DatVM 不,它不会自动关闭输入流。我创建了一个具有静态方法的类来从资产中获取可绘制对象,并将其添加为下面的单独答案。 @СергейГрушин 对于矢量可绘制请使用 VectorDrawableCompat.createFromStream(context.assets.open("Cloths/btn_no.xml"), null)【参考方案2】:我推荐使用这个
Drawable.createFromResourceStream(resources,new TypedValue(), resources.getAssets().open(filename), null)
感谢资源,它返回正确缩放的drawable ...
【讨论】:
【参考方案3】:这是一个使用静态方法从资源中获取可绘制对象的类。它还会关闭输入流。
import android.content.Context;
import android.graphics.drawable.Drawable;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by bartburg on 4-11-2015.
*/
public class AssetsReader
public static Drawable getDrawableFromAssets(Context context, String url)
Drawable drawable = null;
InputStream inputStream = null;
try
inputStream = context.getAssets().open(url);
drawable = Drawable.createFromStream(inputStream, null);
catch (IOException e)
e.printStackTrace();
finally
if(inputStream != null)
try
inputStream.close();
catch (IOException e)
e.printStackTrace();
return drawable;
【讨论】:
【参考方案4】:是的,您可以使用createFromStream() 方法从InputStream
创建Drawable
对象。
【讨论】:
是否也可以在可绘制文件夹中使用可绘制对象?如果可以,比如何? @chiragshah 我不明白。 drawable目录中的图片由系统为你转换。 我需要一种快速的方法来从资产文件夹中加载图像,因为我有很多名称相同但目录不同的地图图块。 @Octavien:看到这个问题。:***.com/questions/4885469/…【参考方案5】:这是为您执行此操作的函数。
检查返回的 Drawable 变量是否为 null,如果路径无效或存在 IOException,则可能返回 null。
public static Drawable getDrawableFromAssetFolder(String fullPath, Activity ctx)
Drawable d =null;
try
d = Drawable.createFromStream(ctx.getAssets().open(fullPath), null);
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
return d;
【讨论】:
【参考方案6】:这有助于获得正确的密度
private Drawable drawableFromAssetFilename(String filename)
AssetManager assetManager = mApplicationContext.getAssets();
InputStream inputStream = null;
try
inputStream = assetManager.open(filename);
catch (IOException e)
e.printStackTrace();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
BitmapDrawable drawable = new BitmapDrawable(mApplicationContext.getResources(), bitmap);
return drawable;
【讨论】:
【参考方案7】:我在 RecyclerView 适配器中工作,发现 David 的 答案对我不起作用,(出于某种原因,asset.open
无论我导入什么内容都未解决)
所以我发现这对我有用(Kotlin 代码)
val d = Drawable.createFromStream(context?.assets?.open("imageData/$imageName.png"), null)
这是我的目录,您可以看到资产从资产文件夹开始,这里是 link 说明如何创建资产文件夹
【讨论】:
【参考方案8】:在这个版本你不能,如果你在你的drawable文件夹中创建一个子文件夹你不能在你的xml文件中使用它,当你使用android:src时它不会被识别。
看看这个帖子:Can the Android drawable directory contain subdirectories?
【讨论】:
既然如此,加载数百个自定义地图图块以显示在屏幕上的最简单方法是什么? 啊,我的问题是关于 assets 文件夹,而不是 drawable。问题已编辑。 由于问题已更新,此答案已过时。以上是关于是否可以从资产文件夹中加载可绘制对象?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 Android 的可绘制对象中使用子文件夹? [复制]
如何在 C# Unity 中加载带有扩展名(.json)的资产文件夹中的任何文件