是否可以从资产文件夹中加载可绘制对象?

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。问题已编辑。 由于问题已更新,此答案已过时。

以上是关于是否可以从资产文件夹中加载可绘制对象?的主要内容,如果未能解决你的问题,请参考以下文章

从颤振资产加载 .pdf 文件/自定义文件

是否可以在 Android 的可绘制对象中使用子文件夹? [复制]

如何在 C# Unity 中加载带有扩展名(.json)的资产文件夹中的任何文件

是否可以从资产文件中获取上次修改日期?

可以通过 Cassandra Datastax 驱动程序从文件中加载语句吗?

Android webview,在资产文件夹中加载javascript文件