VectorDrawable 到位图:空对象引用上的 Bitmap.setHasAlpha(boolean)'
VectorDrawable to Bitmap: Bitmap.setHasAlpha(boolean)' on a null object reference
我正在尝试从 VectorDrawable
(xml 图片)中获取 Bitmap
:
VectorDrawable vectorDrawable = (VectorDrawable) ContextCompat.getDrawable(mContext, R.drawable.test);
Bitmap bitmap = UtilMethods.getBitmapFromVector(vectorDrawable);
但应用程序在 Bitmap.createBitmap
方法上崩溃并出现 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
错误
public static Bitmap getBitmapFromVector(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;
}
p.s.
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
这里有一些简单的 xml 可绘制对象(逗号)
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16000dp"
android:height="16000dp"
android:viewportWidth="16000"
android:viewportHeight="16000">
<path
android:fillColor="#040607"
android:strokeWidth="1"
android:pathData="M3637 11910 l486 -730 484 0 c265 0 483 3 483 8 0 4 -130 331 -288 727 l-288 720
-682 3 -682 2 487 -730z" />
</vector>
我尝试了中的所有方法
他们都失败了这个 .createBitmap
方法
好像是
android:width="16000dp"
android:height="16000dp"
android:viewportWidth="16000"
android:viewportHeight="16000">
价值很大...
我添加的不完整xml,还有更多path
标签,所以它不仅仅是逗号这么大的值:)
我试图将值减少到 2000(例如),应用程序停止崩溃,但它毁了我的形象
从 svg 制作了可绘制的矢量
您正在尝试分配一个 16000x16000dp 位图,根据您 运行 您的应用程序的显示密度,xhdpi 必须乘以 2,xxhdpi 必须乘以 3,xxhdpi 必须乘以 4 xxxhdpi。
这会导致内存问题,因为您正在尝试分配大于 1000MB 的位图。
您需要缩小 Drawable。它不应该导致您遇到的质量损失,所以我建议您检查您的 SVG 或 svg2android 的输出是否有错误...
另外请记住,您不能将大于或高于 GL_MAX_TEXTURE_SIZE 的 Bitmap 放入 ImageView 中。
参见:"Bitmap too large to be uploaded into a texture"
改变
android:width="16000dp"
android:height="16000dp"
到
android:width="24dp"
android:height="24dp"
不需要改变:
android:viewportWidth="16000"
android:viewportHeight="16000">
我正在尝试从 VectorDrawable
(xml 图片)中获取 Bitmap
:
VectorDrawable vectorDrawable = (VectorDrawable) ContextCompat.getDrawable(mContext, R.drawable.test);
Bitmap bitmap = UtilMethods.getBitmapFromVector(vectorDrawable);
但应用程序在 Bitmap.createBitmap
方法上崩溃并出现 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
错误
public static Bitmap getBitmapFromVector(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;
}
p.s.
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
这里有一些简单的 xml 可绘制对象(逗号)
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16000dp"
android:height="16000dp"
android:viewportWidth="16000"
android:viewportHeight="16000">
<path
android:fillColor="#040607"
android:strokeWidth="1"
android:pathData="M3637 11910 l486 -730 484 0 c265 0 483 3 483 8 0 4 -130 331 -288 727 l-288 720
-682 3 -682 2 487 -730z" />
</vector>
我尝试了.createBitmap
方法
好像是
android:width="16000dp"
android:height="16000dp"
android:viewportWidth="16000"
android:viewportHeight="16000">
价值很大...
我添加的不完整xml,还有更多path
标签,所以它不仅仅是逗号这么大的值:)
我试图将值减少到 2000(例如),应用程序停止崩溃,但它毁了我的形象
从 svg 制作了可绘制的矢量您正在尝试分配一个 16000x16000dp 位图,根据您 运行 您的应用程序的显示密度,xhdpi 必须乘以 2,xxhdpi 必须乘以 3,xxhdpi 必须乘以 4 xxxhdpi。 这会导致内存问题,因为您正在尝试分配大于 1000MB 的位图。
您需要缩小 Drawable。它不应该导致您遇到的质量损失,所以我建议您检查您的 SVG 或 svg2android 的输出是否有错误...
另外请记住,您不能将大于或高于 GL_MAX_TEXTURE_SIZE 的 Bitmap 放入 ImageView 中。 参见:"Bitmap too large to be uploaded into a texture"
改变
android:width="16000dp"
android:height="16000dp"
到
android:width="24dp"
android:height="24dp"
不需要改变:
android:viewportWidth="16000"
android:viewportHeight="16000">