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

안드로이드 setBounds()질문 드리려고 합니다.

0 추천
저는 현재 이미지가 바뀌면서 옆으로 이동하는 코드를 구성하고 있습니다.
 
이미지가 움직이는것 까진 되는데 문제는 이미지가 시작하는 위치를 바꾸려고 하는데
 
그게 잘 되지 않습니다;;;
 
 
 
1. setBounds()문제
아래는 저의 코드입니다.
 
package com.example.tower_defense;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

class ImageThread extends Thread{
SurfaceHolder mHolder;
    int mImageWidth;
    int mImageHeight;
    int mCount = 0;
    Drawable mFrontImage[] = new Drawable[4];
    Bitmap mBackImage[] = new Bitmap[4];
    
    int a,b=0;
    public ImageThread(Context context, SurfaceHolder surfaceHolder){
     mHolder = surfaceHolder;
     
     Resources res = context.getResources();
     
     mFrontImage[0] = res.getDrawable(R.drawable.testimage1);
     mFrontImage[1] = res.getDrawable(R.drawable.testimage2);
     mFrontImage[2] = res.getDrawable(R.drawable.testimage3);
     mFrontImage[3] = res.getDrawable(R.drawable.testimage4);
     
     
   
        mBackImage[0] = BitmapFactory.decodeResource(res,
                R.drawable.gallery_selected_default);
        mBackImage[1] = BitmapFactory.decodeResource(res,
                R.drawable.gallery_selected_focused);
        mBackImage[2] = BitmapFactory.decodeResource(res,
                R.drawable.gallery_selected_pressed);
        mBackImage[3] = BitmapFactory.decodeResource(res,
                R.drawable.gallery_unselected_default);
        
     mImageWidth = mFrontImage[1].getIntrinsicWidth();
     mImageHeight = mFrontImage[1].getIntrinsicHeight();
     
     
    }
    
    public void run(){
     while(true){
     Canvas c = null;
     try{
     c = mHolder.lockCanvas(null);
     synchronized(mHolder){
     doDraw(c);
     mCount++;
     sleep(200);
     }
     }catch(Exception e){
     Log.e("ThreadAnimationView", "Exception in thread",e);
     }finally{
     if(c != null){
     mHolder.unlockCanvasAndPost(c);
     }
     }
     }
    }
    
    private void doDraw(Canvas canvas){
     if(canvas != null){
     a += 80;
     //b += 20;
     //mFrontImage[mCount % 4].setBounds(50, 250, 70, 70);
     mFrontImage[mCount % 4].setBounds(70, 320, 70 + mImageWidth, 320 + mImageHeight);
     canvas.translate(a, 30);
     mFrontImage[mCount % 4].draw(canvas);
     
     }
    }
}

public class ThreadAnimationView extends SurfaceView implements Callback{

private ImageThread thread;

public ThreadAnimationView(Context context, AttributeSet attrs){
super(context, attrs);

init(context);
}

private void init(Context context){
SurfaceHolder holder = getHolder();
holder.addCallback(this);

thread = new ImageThread(context, holder);
}

public void surfaceCreated(SurfaceHolder holder){
thread.start();
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }
    
public void surfaceDestroyed(SurfaceHolder holder) {
        try {
            thread.join();
            //thread.join()은 스레드가 종료될 때 까지
            //호출스레드를 차단한다.
        } catch (InterruptedException ex) {}
    }
}
 
mFrontImage[mCount % 4].setBounds(70, 320, 70 + mImageWidth, 320 +mImageHeight);
 
이부분이 setBounds부분인데, 제가 그림을 시작하는 위치를 바꾸고 싶어서
 
setBounds()의 인자값을 보면 처음 2개의 인자값은 그림의 위치, 나머지 두개의 인자값은 이미지의 크기로
 
알고 있습니다. 그런데 처음 인자값 2개를 바꾸면 이미지가 이동하진않고 이미지의 크기가 변해버립니다.
 
이미지의 크기가 바뀌면서 이미지의 좌표도 이상한곳으로 이동해버립니다.
 
어떻게 하면 이미지가 시작되는 위치를 바꿀수가 있나요??
 

 

공대학개론 (200 포인트) 님이 2014년 7월 29일 질문
공대학개론님이 2014년 7월 29일 수정

1개의 답변

0 추천
http://developer.android.com/reference/android/graphics/drawable/Drawable.html

left, top을 변경하셨으니 좌상단 좌표가 바뀌었을 것이고,

left, top 좌표가 바뀌고 right, bottom은 그대로니 이미지 크기가 변경되버린거죠.

+ mImageWidth, + mImageHeight 의 의미를 모르고 쓰신것 아닌가요?
Gioskhan (12,060 포인트) 님이 2014년 7월 30일 답변
답변을 해주신것에 대하여 감사드립니다.
이 게시물을 올린 후 setBounds()에 대해 알아보았는데
setBounds(left, top, right, bottom) 이 문장에서
인자값들이 정확히 무슨 역할을 하는지 잘 모르겠습니다.
Gioskhan님께서 올려주신 사이트에 들어가서 찾아봤는데 그래도 잘 모르겠습니다;;
인자값들의 역할에 대하여 설명해 주실수 있나요?
해당 개체의 좌표값이에요. x,y 좌표에 대해선 아시죠?
사각형의 영역을 말해줍니다.
x1, y1 부터 x2, y2 (= left, top 부터 right, bottom)
좌표로 접근하시면 이해가 쉬우리라 생각되는데..
right의 값이 width가 아니라 x2 라는 것이 핵심입니다.
즉 width는 x2-x1 이 되는 것이지요..
0, 0, 100, 100 이라면
0, 0이 좌상단 꼭지점, 100, 100이 우하단 꼭지점.
즉 width는 x2-x1이니 100
답변해주셔서 정말로 감사드립니다(__)
...