Android View.getDrawingCache는 null 만 반환합니다. null) {

누구든지 이유를 설명해 주시겠습니까

public void addView(View child) {
  child.setDrawingCacheEnabled(true);
  child.setWillNotCacheDrawing(false);
  child.setWillNotDraw(false);
  child.buildDrawingCache();
  if(child.getDrawingCache() == null) { //TODO Make this work!
    Log.w("View", "View child's drawing cache is null");
  }
  setImageBitmap(child.getDrawingCache()); //TODO MAKE THIS WORK!!!
}

항상 그리기 캐시가 null임을 기록하고 비트 맵을 null로 설정합니까?

캐시가 설정되기 전에 실제로 뷰를 그려야합니까?

감사!



답변

나는 또한이 문제가 있었고 다음 답변을 찾았습니다.

v.setDrawingCacheEnabled(true);

// this is the important code :)  
// Without it the view will have a dimension of 0,0 and the bitmap will be null          
v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());

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


답변

getDrawingCache항상 returning null사람 이라면 다음을 사용하십시오.

public static Bitmap loadBitmapFromView(View v) {
     Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
     Canvas c = new Canvas(b);
     v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
     v.draw(c);
     return b;
}

참조 : https://stackoverflow.com/a/6272951/371749


답변

null을 얻는 기본적인 이유는 뷰가 언급되지 않았기 때문입니다. 그런 다음 view.getDrawingCache () 및 view.buildDrawingCache ()를 포함하여 view.getWidth (), view.getLayoutParams (). width 등을 사용하는 모든 시도는 쓸모가 없습니다. 따라서 먼저 뷰에 치수를 설정해야합니다. 예 :

view.layout(0, 0, width, height);

(원하는대로 ‘너비’와 ‘높이’를 이미 설정했거나 WindowManager 등으로 획득했습니다.)


답변

대신 이것을 사용하고 있습니다.

myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Bitmap bitmap = Bitmap.createBitmap(myView.getDrawingCache());
        }
    });


답변

최고의 4me 작업

    Bitmap bitmap = Bitmap.createBitmap( screen.getMeasuredWidth(), screen.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    screen.layout(0, 0, screen.getMeasuredWidth(), screen.getMeasuredHeight());
    screen.draw(canvas);


답변

원하는 뷰가 실제로 화면에 표시되지만 null을 반환하는 경우. 즉, 창 관리자가 생성하기 전에 뷰를 포착합니다. 일부 레이아웃은 매우 복잡합니다. 레이아웃에 중첩 레이아웃, layout_weight..etc가 포함되어 있으면 정확한 크기를 얻기 위해 여러 번 중계가 발생합니다. 가장 좋은 해결책은 창 관리자가 작업을 마칠 때까지 기다린 다음 스크린 샷을 얻는 것입니다. 핸들러에 getDrawingCache ()를 넣으십시오.


답변

@ cV2와 @nininho의 답변은 모두 저에게 효과적입니다.

내가 어려운 방법을 알아 낸 다른 이유 중 하나는 내가 가진 뷰가 너비와 높이가 0 인 뷰를 생성하고 있다는 것입니다 ( 즉, 빈 문자열의 문자열 텍스트가있는 TextView가 있다고 상상해보십시오 ). 이 경우 getDrawingCache는 null을 반환하므로 반드시 확인하십시오. 그것이 어떤 사람들에게 도움이되기를 바랍니다.