2013-05-16 3 views
2

특정보기에서 비트 맵을 생성하는 데 문제가 있습니다. 제한 사항은보기 (그리기)로 렌더링 할 수 없다는 것입니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까?Android : 그림이없는보기의 비트 맵 생성

클래스 뷰 (http://developer.android.com/reference/android/view/View.html)의 문서에는 Android에서보기를 렌더링하는 데 사용되는 단계에 대한 설명이 있습니다. 이 경우 우리는 "레이아웃"단계에 있지만 "드로잉"에는 들어 가지 않습니다. 어떤 생각을 가진 사람이라면 모범을 보일 수 있습니까?

내 코드는 예외를 생성하는

: 오류 -> 너비와 높이가 있어야합니다> 0

... 
public static Bitmap loadBitmapFromView(View v) { 
    Bitmap b = null; 
    try { 
     b = Bitmap.createBitmap(
       v.getWidth(), 
       v.getHeight(), 
       Bitmap.Config.ARGB_8888);     
     Canvas c = new Canvas(b); 
     v.measure(v.getWidth(), v.getHeight()); 
     v.layout(0, 0, v.getWidth(), v.getHeight()); 
     v.draw(c); 

    } catch (Exception e) { 

     Log.e(MainActivity.TAG, "error -> "+e.getMessage()); 
    } 



    return b; 
} 


public void snap(View v) { 


    LayoutInflater inflate = (LayoutInflater) getBaseContext() 
      .getSystemService(LAYOUT_INFLATER_SERVICE); 
    View view = new View(getBaseContext()); 
    view = inflate.inflate(R.layout.list_item, null); 


    Log.d(MainActivity.TAG, "getWidth -> "+view.getWidth()); 
    Log.d(MainActivity.TAG, "getHeight -> "+view.getHeight()); 

    Bitmap b = loadBitmapFromView(view); 
    if (b != null) { 

     LinearLayout mainLayout = (LinearLayout) findViewById(R.id.LinearLayout1); 
     ImageView image = new ImageView(this); 
     image.setImageBitmap(b); 

     mainLayout.addView(image); 
    } 


} 
+0

난 정말 당신이 달성하고자하는 것을 이해하지 못했다 : –

+0

비트 맵을 그리지 않고도 뷰에서 비트 맵을 생성 할 수 있습니까? 화면에 그려지지 않은 뷰에 이미지 (비트 맵)를 생성하고 싶습니다. 아이디어는 여러 비트 맵 이미지를 생성하고 필요한 경우에만 표시하는 것입니다. –

답변

8

나는 해결책이 방법을 발견했다. 그러나 뷰는`onMeasure` 단계 전에는 크기가 없습니다. 그래서, 그냥 트릭을하지 않을 전망을 부풀게하십시오.
1

당신은 바로 인플레이션 후 뷰의 폭과 높이를 얻기 위해 노력하고 있지만,보기 아무튼 레이아웃이 끝날 때까지는 크기가 없습니다. 직접 크기를 결정하거나 (MeasureSpec이 무엇이든 measure()이라고 부름) 레이아웃의 일부로 사용하고 Invisible로 설정하고 레이아웃 후에 비트 맵을 뷰에서로드하려고 시도 할 수 있습니다.

public static Bitmap getScreenViewBitmap(final View v) { 
    v.setDrawingCacheEnabled(true); 

    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 

    return b; 
} 
+0

안녕하세요 kcoppock, 귀하의 제안은이 토론과 같습니다 : http://stackoverflow.com/questions/4393612/when-can-i-first-measure-a-view? –

+1

오른쪽, 당신은 onGlobalLayout 리스너를 추가 할 수 있지만 뷰는 레이아웃의 일부 여야합니다. 귀하의 단계가 작동해야합니다, 문제는 현재 시간에 getWidth() 및 getHeight()에 의존 할 수 없다는 것입니다. 거기에 값을 하드 코드하면 작동 할 것입니다. 이 시나리오에서는 값을 하드 코딩하거나 뷰를 직접 측정하여 적절한 크기를 가져와야합니다. – kcoppock