当前位置: 首页 > 知识库问答 >
问题:

从矢量绘制中获取位图

邵逸明
2023-03-14

在我的应用程序中,我必须为通知设置一个大图标。LargeIcon必须是位图,我的可绘制内容是矢量图像(Android中的新功能,请参见此链接)。问题是,当我尝试解码矢量图像资源时,返回空值。

以下是代码示例:

if (BitmapFactory.decodeResource(arg0.getResources(), R.drawable.vector_menu_objectifs) == null)
        Log.d("ISNULL", "NULL");
    else
        Log.d("ISNULL", "NOT NULL");

在本示例中,当我替换R.drawable时。vector_menu_objectifs带有“普通”图像,例如png,结果不为空(我得到了正确的位图)是否缺少什么?

共有3个答案

裴威
2023-03-14

您可以使用以下方法:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static Bitmap getBitmap(VectorDrawable vectorDrawable) {
    Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(),
            vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    vectorDrawable.draw(canvas);
    return bitmap;
}

我有时会把它和:

private static Bitmap getBitmap(Context context, int drawableId) {
    Drawable drawable = ContextCompat.getDrawable(context, drawableId);
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable) drawable).getBitmap();
    } else if (drawable instanceof VectorDrawable) {
        return getBitmap((VectorDrawable) drawable);
    } else {
        throw new IllegalArgumentException("unsupported drawable type");
    }
}
林涵映
2023-03-14

如果您愿意将Android KTX用于静态编程语言,您可以使用扩展方法Drawable#toBitmap()来实现与其他答案相同的效果:

val bitmap = AppCompatResources.getDrawable(requireContext(), drawableId).toBitmap() 

val bitmap = AppCompatResources.getDrawable(context, drawableId).toBitmap() 

要添加这个和其他有用的扩展方法,您需要将以下内容添加到您的模块级别build.gradle

repositories {
    google()
}

dependencies {
    implementation "androidx.core:core-ktx:1.2.0"
}

有关向项目添加依赖项的最新说明,请参阅此处。

请注意,这将适用于Drawable的任何子类,如果Drawablebitmappdrawable的话,它将提供使用底层位图的快捷方式。

鄢选
2023-03-14

检查API:17、21、23

public static Bitmap getBitmapFromVectorDrawable(Context context, int drawableId) {
    Drawable drawable = ContextCompat.getDrawable(context, drawableId);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        drawable = (DrawableCompat.wrap(drawable)).mutate();
    }

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
            drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}

更新:

格拉德尔项目:

dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0-alpha5'
    }

模块梯度:

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.3'
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 23
        vectorDrawables.useSupportLibrary = true
    }
    ...
}
...
 类似资料:
  • 问题内容: 我正在学习线性代数课程,我想可视化正在使用的向量,例如向量加法,法向向量等。 例如: 在这种情况下,我想绘制3个向量。 然后,我应该能够添加V1,V2来绘制一个新的向量V12(全部合并在一个图中)。 当我使用以下代码时,情节与预期不符 问题答案: 多亏了每个人,您的每个帖子对我都有很大帮助。 对于我的问题,rbierman代码非常简单,我做了一些修改,并创建了一个函数来绘制给定数组中的

  • 我想用ApachePDFBox在PDF上绘制一个矢量图像。 这是我用来绘制普通图像的代码 如果我使用或图像而不是png,则生成的PDF文档会损坏。 我希望图像是矢量图像的主要原因是,使用PNG或JPG时,图像看起来很糟糕,我认为它会被压缩,所以看起来很糟糕。对于矢量图像,这不应该发生(当我在Inkscape中将svg路径导出为PDF时,它不会发生,矢量路径会被保留)。 有没有办法使用Apache

  • 我使用的是23.4版的设计支持库。0.我已启用渐变标志: 我正在使用构建工具23.0版。2,但我仍然在KitKat或更低版本上获得。 当我使用或。 是的,我在每一个我使用抽绳的活动中都会用到这个 这是支持库的错误吗?

  • 我面临以下问题:我必须给成千上万的图形用户界面元素命名。如果它能像这样工作,那就太好了: 如果我能将元素的名称设置为“Classname.myMenuItem”,那就太好了。 是否有任何方法来获取变量的名称(变量名称ofc,而不是JMenuItem.getName())?

  • 问题内容: 我有以下数据: 我使用以下代码将其绘制在seaborn中: 如何获得每个组的X跨度?例如,父组的swarmplot的水平跨度的范围是多少? 问题答案: 您可以从中创建的信息。 实际返回matplotlib实例,然后从那里可以找到它创建的实例。要获取职位,我们可以使用。 这是您的示例,进行了修改以查找并打印群限制,然后使用它们在群周围绘制方框。 打印: 这是图:

  • 问题内容: 我正在开发一个Android项目,并且选择显示图标是因为它具有适应性和动态性,但是我只能在运行Android且具有API 21或更高版本的设备上运行此应用程序。我的问题是如何在较低的Android版本(即API 14或更高版本)上使用。谢谢! 问题答案: 使用支持库23.2,一直到API v7都对Vector Drawables提供了真正的支持。建议通过添加以下内容来禁用该支持的先前版