我试图从视图中获取位图,因为我想模糊该位图并将其用作后续活动的背景。 Logcat给了我:
NullPointerException at android.graphics.Bitmap.createBitmap(Bitmap.java:484)
我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the view from activity_main.xml
setContentView(R.layout.activity_splash_page);
ProgressWheel wheel = (ProgressWheel) findViewById(R.id.progress_wheel);
wheel.setClickable(false);
TextView touch = (TextView) findViewById(R.id.touch_splash);
touch.setClickable(false);
TextView level = (TextView) findViewById(R.id.level_splash);
level.setClickable(false);
wheel.setProgress(0.7f);
wheel.setClickable(true);
touch.setClickable(true);
level.setClickable(true);
RelativeLayout view = (RelativeLayout)findViewById(R.id.viewtocapture);
ImageView bmImage = (ImageView)findViewById(R.id.imageView);
view.setDrawingCacheEnabled(true);
// this is the important code :)
// Without it the view will have a dimension of 0,0 and the bitmap will be null
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache(true);
view.buildDrawingCache();
Bitmap b = Bitmap.createBitmap(view.getDrawingCache()); //Line 53
view.setDrawingCacheEnabled(false); // clear drawing cache
bmImage.setImageBitmap(b);
wheel.setProgress(0.0f);
}
这里是Stacktrace / Logcat:
Caused by: java.lang.NullPointerException
at android.graphics.Bitmap.createBitmap(Bitmap.java:484)
at com.redstonedevelopers.status_v1.SplashPage.onCreate(SplashPage.java:53)
at android.app.Activity.performCreate(Activity.java:5047)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2056)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
at android.app.ActivityThread.access$700(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4867)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
我尝试过以下答案: 在这里:take a screenshot from the activity 在这里:NullPointerException in createBitmap() from View 在这里:android createBitmap NullPointerException
一切都无济于事。我应该做些什么来改变和/或做些什么呢?
-R
答案 0 :(得分:1)
试试这个。
实际绘制视图时,这将启动
然后你应该能够为它保存位图。
-----确保 bmImage 和视图应该是类级别,以便我们可以在ViewTreeObserver触发时使用它们。
bmImage = (ImageView)findViewById(R.id.imageView);
view = (RelativeLayout)findViewById(R.id.viewtocapture);
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
System.out.println(view == null ? "is null" : "not null");
Bitmap b = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
view.draw(c);
bmImage.setImageBitmap(b);
}
});
答案 1 :(得分:1)
在onCreate()
之后,视图树不会被测量,布局和渲染。
您可以使用树视图布局观察器,如下所示。
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// inflate your main layout here (use RelativeLayout or whatever your root ViewGroup type is
LinearLayout mainLayout = (LinearLayout ) this.getLayoutInflater().inflate(R.layout.activity_splash_page, null);
// set a global layout listener which will be called when the layout pass is completed and the view is drawn
mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
//Remove the listener before proceeding
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mainLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
mainLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
// do your thing here
}
}
);
setContentView(mainLayout);
答案 2 :(得分:1)
我使用这样的代码在canvas对象上绘制视图。 不确定这是否适用于您的情况。
picturePreLoad = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(picturePreLoad);
MyView.draw(canvas);
答案 3 :(得分:0)
就我而言,问题在于默认情况下将位图文件复制到Drawable V24
中,而不是Drawable
中。
为了能够同时查看两个文件夹,请在左上角将设置从 Android 更改为 Project 。
然后转到app.src.main.res
,在那里您可以看到Drawable V24
和Drawable
。
您只需要从Drawable V24
中删除位图,然后将它们添加到Drawable
中即可。