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

이미지 뷰의 꼭지점의 좌표값을 알고싶습니다.

0 추천

public class CaptureActivity extends Activity {
 
 static ImageView image1 = null;
 Bitmap photo =null;
 FrameLayout mFrameLayout;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.activity_capture);
    
  Bundle b = getIntent().getExtras();  
  image1 = (ImageView) findViewById(R.id.image1);
      
  photo = BitmapFactory.decodeFile(b.getString("path"));  
  image1.setImageBitmap(photo);        
    
  System.out.println("이미지 왼쪽값: "+ image1.getLeft());
  System.out.println("이미지 오른값: "+ image1.getRight());
  System.out.println("이미지 밑: " + image1.getBottom());
  System.out.println("이미지 : "+ image1.getMeasuredWidth());
  
  
  
        DrawView mDraw = new DrawView(this);        
        mFrameLayout = (FrameLayout) findViewById(R.id.frame);       
        mFrameLayout.addView(mDraw);
   
 }

---------------------------------------------------------------------------------------------
public DrawView(Context context) {
    
        super(context);
        
        canvas = new Canvas(); 
        paint = new Paint();
        setFocusable(true);        
        
        point1 = new Point();
        point1.x = ((CaptureActivity)context).getLeft();
        point1.y = ((CaptureActivity)context).getTop();
        
        Log.d(TAG,"context 왼쪽값"+((CaptureActivity)context).getRight() + " ");        
        Log.d(TAG,"context 윗값"+((CaptureActivity)context).getBottom() + " ");
        
        point2 = new Point();
        point2.x = ((CaptureActivity)context).getRight();
        point2.y = ((CaptureActivity)context).getTop();

        point3 = new Point();
        point3.x = ((CaptureActivity)context).getRight();
        point3.y = ((CaptureActivity)context).getBottom();

        point4 = new Point();
        point4.x = ((CaptureActivity)context).getLeft();
        point4.y = ((CaptureActivity)context).getBottom();

액티비티에 이미지뷰에 꼭지점의 좌표를 얻어 오기를 원하는데 값을 찍어보니 getRight,getLeft 등 모두 0이 찍힙니다.

어떻게 해야 MyView로 이미지뷰의 크기를 얻을수 있을까요?

그리고 MyView 에서 액티비티를 호출할때 (( CaotyreActivity)context) 이방식 말고 다른 방법 없나요?

안드로이드 초보라서 고수님에 도움을 받고 싶습니다.

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

2개의 답변

+2 추천
 
채택된 답변

get하는 시점이 화면에 그려지기 전이기 때문에 0입니다.

그러므로 그려지고 난 후에 가져오시면됩니다.

그려지고 난 후 시점은 Activity의  onWindowFocusChanged(hasFocus)가 호출되고 난 후입니다.

다만 edittext 같은 것을 선택하더라도 호출될 수 있습니다.

MyView에서 호출할 수 잇는 방법은 MyView에 Activity를 전역변수로 두고 사용 하면됩니다.

 

dev_아마 (9,750 포인트) 님이 2014년 5월 15일 답변
slee2540님이 2014년 5월 15일 채택됨
onWindowFocusChanged(hasFocus)
그려지고 다음을 이함수 통해서 그리면 되나요?
System.out.print로 하니 이미뷰의 크기를 알수 있었습니다.
하지만 image.setRight(image1.getRight()); 해넣으니 값이 들어가지 않습니다.
리턴값으로 비교를 해야하나여? 조금 더 구체적으로 알수 없을까요?
+1 추천
지금 구현한 대로면 액티비티의 상단 좌측 좌표이므로 0,0이 되는 것이 아닌지요?

이미지뷰를 추출하여 이미지뷰의 위치를 확인해보시기를 바랍니다. 참.. DrawView에서 말입니다..
인연 (31,880 포인트) 님이 2014년 5월 15일 답변
제가 초보라서 그러는데 좀더 구체적으로 말씀 해주시면 안될까여?
음... dev_아마님의 답변을 참고해보자면 일단 onCreate가 호출될 때는 뷰가 그려지기 전이라 좌표가 안 찍힌다고 하네요. 그럼 뷰가 그려지고 난 뒤에 호출되는 함수를 재정의 하여 좌표를 구하도록 하면 되겠습니다... 뭐... 모르겠다! 싶으면 쓰레드를 돌려서 값이 바뀌면 반복을 중단하면 되겠네요. 다만 후자의 방법은 추천하지는 않습니다;
public void onWindowFocusChanged(boolean hasFocus) {
        
                 
        
        System.out.println(" "+image1.getLeft());
        System.out.println(" "+image1.getRight());
        System.out.println(" "+image1.getTop());
        System.out.println(" "+image1.getBottom());
        
        imageLeft = image1.getLeft();
        imageRight = image1.getRight();
        imageBottom = image1.getTop();
        imageTop = image1.getBottom();
       
        super.onWindowFocusChanged(hasFocus);
//        image1.setRight(image1.getRight());
//        image1.setLeft(image1.getLeft());
//        image1.setTop(image1.getTop());
//        image1.setBottom(image1.getBottom());
//        
//        setR(image1, image1.getRight());
//        setL(image1, image1.getLeft());
       
    }
이렇게 안에다가 값을 넣었는데도 값이 들어가지가 않네요.
감사합니다. 순서를 바꾸어 보니 잘되었습니다.
    public void onWindowFocusChanged(boolean hasFocus) {        
              
        System.out.println(" "+image1.getLeft());
        System.out.println(" "+image1.getRight());
        System.out.println(" "+image1.getTop());
        System.out.println(" "+image1.getBottom());
        
        
//        imageLeft = image1.getLeft();
//        imageRight = image1.getRight() -100;
//        imageBottom = image1.getTop();
//        imageTop = image1.getBottom()- 100;
        mFrameLayout = (FrameLayout) findViewById(R.id.frame);
        
        imageLeft = mFrameLayout.getLeft();
        imageRight = mFrameLayout.getRight();
        imageBottom = mFrameLayout.getTop();
        imageTop = mFrameLayout.getBottom();
       
        DrawView mDraw = new DrawView(this);        
               
        mFrameLayout.addView(mDraw);      
      
    }

그런데 질문이 있습니다. 제가 생각한것과 다르게 이미지뷰에 꽉차게 이미지를 넣지 않는경우.그안에 비트맵에 넣은 이미지 꼭지점을 잡아야하는데 matrix를 사용해야 하는건가요?
네.
http://blog.naver.com/rkdmfql1540?Redirect=Log&logNo=150143892243
위 블로그 보고 Matrix 사용했더니 잘 되네요..
...