2014-11-04 3 views
0

레이아웃을 비트 맵으로 바꿀 수있었습니다. 그때 내가하고 싶은 무언가를 흐리게 비트 맵 Renderscript 흐림 메서드를 사용하여 설정했지만 비트 맵을 흐리게 할 때 NullPointerException 점점 계속.레이아웃을 흐릿하게 할 때 NPE 비트 맵

내 Renderscripy blurr 메서드를 다른 비트 맵에 전달하면 작동하지만 레이아웃에서 만든 비트 맵을 전달할 때 작동하지 않습니다.

내가 여기 잘못 알고있는 사람이 있습니까? 이것은 나를 미치게합니다.

RelativeLayout blurlayout; 

    blurlayout = (RelativeLayout) view.findViewById(R.id.blurcontainer); 

blurlayout.setDrawingCacheEnabled(true); 
blurlayout.buildDrawingCache(); 

Bitmap bluredlayout = blurlayout.getDrawingCache(); 

    //This returns null 
Bitmap finalBlur = Bitmap.createBitmap(fastblur16(bluredlayout, 25, getActivity())); 

Drawable d = new BitmapDrawable(getResources(), finalBlur); 


private static Bitmap fastblur16(Bitmap source, int radius, Context ctx) { 
Bitmap bitmap = source.copy(source.getConfig(), true); 
RenderScript rs = RenderScript.create(ctx); 
Allocation input = Allocation.createFromBitmap(rs, source, 
     Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); 
Allocation output = Allocation.createTyped(rs, input.getType()); 
ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, 
     Element.U8_4(rs)); 
script.setRadius(radius); 
script.setInput(input); 
script.forEach(output); 
output.copyTo(bitmap); 
return bitmap; 
} 

스택 추적 : I 시도 내가

blurlayout = (RelativeLayout) view.findViewById(R.id.blurcontainer); 

    blurlayout.setDrawingCacheEnabled(true); 
    blurlayout.buildDrawingCache(true); 

    drawnCacheBittmap = Bitmap.createBitmap(blurlayout.getDrawingCache()); 

    blurlayout.setDrawingCacheEnabled(false); 

다음 나의 조각에 onCreateView에서이 코드를

: @Katerina의 A.의 솔루션을 사용하여

FATAL EXCEPTION: main 
java.lang.NullPointerException 
at com.example.stackoverflowquestion.FragmentView.fastblur16(FragmentView.java:221) 
at com.example.stackoverflowquestion.FragmentView.onCreateView(FragmentView.java:178) 
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1504) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:942) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484) 
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:482) 
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:1073) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:919) 
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441) 
at android.view.View.measure(View.java:16030) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
at android.view.View.measure(View.java:16030) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:314) 
at android.view.View.measure(View.java:16030) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012) 
at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:302) 
at android.view.View.measure(View.java:16030) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:314) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2196) 
at android.view.View.measure(View.java:16030) 
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1915) 
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1290) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1009) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5508) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
at android.view.Choreographer.doFrame(Choreographer.java:532) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
at android.os.Handler.handleCallback(Handler.java:730) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:213) 
at android.app.ActivityThread.main(ActivityThread.java:5225) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
at dalvik.system.NativeStart.main(Native Method) 

onStart를 사용하여

@Override 
public void onStart() { 
    // TODO Auto-generated method stub 

    Bitmap bluredlayout = Bitmap.createBitmap(fastblur16(drawnCacheBitmap, 25, 
      getActivity())); 

    Drawable d = new BitmapDrawable(getResources(), bluredlayout); 

    int sdk = android.os.Build.VERSION.SDK_INT; 
    if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) { 
     blurlayout.setBackgroundDrawable(d); 
    } else { 
     blurlayout.setBackground(d); 
    } 

    super.onStart(); 
} 
+0

스택 트레이스를 게시하십시오. – MemLeak

+0

@MemLeak 업데이트했습니다. – Jack

+0

bluredlayout 비트 맵이 null이 아닌가요? –

답변

1

도면 캐시 비트 맵이 null 인 것으로 의심됩니다. 당신은

v.setDrawingCacheEnabled(true); 
v.buildDrawingCache(true); 
Bitmap b = Bitmap.createBitmap(v.getDrawingCache()); 
v.setDrawingCacheEnabled(false); // clear drawing cache 

을 drawingCache

를 얻기 전에 다음을 수행해야 나는 여전히 타이밍의 문제라고 생각합니다. onCreateView에서 getDrawingCache를 호출하면 레이아웃이 아직 측정되었는지 확실하지 않습니다. 나는 개인적으로 onStart에서 drawingCache를 얻으려고 시도 할 것이다. 또는 PreDrawListener를 사용하여 시스템 준비가 완료되면 즉시 수행 할 수 있습니다. 예를 들어.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_layout, container, false); 
    view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 
      image.getViewTreeObserver().removeOnPreDrawListener(this); 
      image.buildDrawingCache(); 

      Bitmap bmp = image.getDrawingCache(); 
      fastblur(bmp); 

     } 
    }); 
    return view; 
} 
+0

이 작업을 수행 할 때 여전히 NPE가 발생합니다. – Jack

+0

onCreate에서 메서드를 호출하고 있습니까? 활동이로드 된 후에해야합니다. –

+0

예,하지만 조각을 시작하자마자 희미 해지기를 바랍니다. – Jack