마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

이미지뷰 위에 다른 View에 그려진 부분을 비트맵으로 저장

0 추천
protected void onCreate(Bundle savedInstanceState) {
 
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_capture);
 
Bundle b = getIntent().getExtras();
image1 = (ImageView) findViewById(R.id.image1);
 
photo = BitmapFactory.decodeFile(b.getString("path"));
image1.setImageBitmap(photo);
mFrameLayout = (RelativeLayout) findViewById(R.id.frame);
 
controlInflater = LayoutInflater.from(getBaseContext());
        View viewControl = controlInflater.inflate(R.layout.control2, null);
        LayoutParams layoutParamsControl  = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        this.addContentView(viewControl, layoutParamsControl);
        
//        mDraw.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
//                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        
        
        Button cancle = (Button) findViewById(R.id.cancle);
        
        cancle.setOnClickListener(new View.OnClickListener() {
            @Override
public void onClick(View v) {
                            finish();
            }
        });
        
        Button crop = (Button) findViewById(R.id.crop);
        
        crop.setOnClickListener(new View.OnClickListener() {
            @Override
public void onClick(View v) {
           
             Log.d("리소스값", ""+bit);
                  Log.d("리소스값", ""+mDraw.getResources());
                  Log.d("id 값", ""+R.id.cropImage);
                  
                  if(bit !=null) {
               Intent intent = new Intent(getBaseContext(), ClipActivity.class);                
               intent.putExtra("Bitmap", bit);
               startActivity(intent);
                  }
            }
        });        
}
 
public void onWindowFocusChanged(boolean hasFocus) {              
        
    imageLeft = image1.getLeft();
    imageRight = image1.getRight();
    imageBottom = image1.getTop();
    imageTop = image1.getBottom();
   
    if(mDraw == null) {
    mDraw = new DrawView(this);
    //mDraw.setId(100);
    //mDraw.measure(imageRight, imageBottom);
    mFrameLayout.addView(mDraw);
    }
    else
    bit = mDraw.getDrawingCache();
        
    }
이미지 뷰위에 다른뷰를 올려서 그림을 그렸습니다. 그런데 이것을 getDrawingCache(); 써서 넘기려고 하니 null값만 들어 오네요.  위에 소스에서 bit이 null값이 들어가는지 모르겠습니다.
고수님들의 답변 부탁드립니다.

 

slee2540 (470 포인트) 님이 2014년 5월 22일 질문

1개의 답변

0 추천

getDrawingCache()함수의 경우 타 함수와는 달리 사용을 하겠다는 선언이 먼저 명시 되어야 합니다~!

사용하시려는 목적이 있어 아시겠지만....

무작정 위 함수 호출시 비트맵을 리턴 해주려면 생성되는 모든 뷰가 비트맵화 되어 메모리에 누적이 되어버리니 말입니다~~! 큰일 나겠죠???~! ㅋ

그래서 getDrawingCache()함수를 쓰시기 전에 buildDrawingCache()를 사용하여 비트맵을 먼저 만드셔야 해용~~!

참 쉽죠잉??

ThisPlus (46,920 포인트) 님이 2014년 5월 22일 답변
public void onWindowFocusChanged(boolean hasFocus) {              
       
        imageLeft = image1.getLeft();
        imageRight = image1.getRight();
        imageBottom = image1.getTop();
        imageTop = image1.getBottom();
       
        if(mDraw == null) {
            mDraw = new DrawView(this);           
            mFrameLayout.addView(mDraw);
        }
        else{
            mDraw.setDrawingCacheEnabled(true);
            mDraw.buildDrawingCache();
            bit = mDraw.getDrawingCache();
            //bit = this.getBitmapFromView(mDraw);
        }    
        

    public static Bitmap getBitmapFromView(View view) {
        //Define a bitmap with the same size as the view
        Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
        //Bind a canvas to it
        Canvas canvas = new Canvas(returnedBitmap);
        //Get the view's background
        Drawable bgDrawable =view.getBackground();
        if (bgDrawable!=null)
            //has background drawable, then draw it on the canvas
            bgDrawable.draw(canvas);
        else
            //does not have background drawable, then draw white background on the canvas
            canvas.drawColor(Color.WHITE);
        // draw the view on the canvas
        view.draw(canvas);
        //return the bitmap
        return returnedBitmap;
    }
함수로도 만들어 보고 말하시는 buildDrawingCache()도 사용해봤지만 값가지고 오지를 못하네요. 다른 방법 혹시 아시나요?

crop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 
                  Log.d("리소스값", ""+bit);
                  Log.d("리소스값", ""+mDraw.getResources());
                  Log.d("id 값", ""+R.id.cropImage);
                  
                  if(bit !=null) {
                    Intent intent = new Intent(getBaseContext(), ClipActivity.class);                    
                    intent.putExtra("Bitmap", bit);
                    startActivity(intent);
                  }
            }
        });
...