누구든지 이유를 설명해 주시겠습니까
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;
}
답변
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을 반환하므로 반드시 확인하십시오. 그것이 어떤 사람들에게 도움이되기를 바랍니다.