안녕하세요~ 코린이 입니다!!
현재 제가 공부하면서 만들고 있는 안드로이드 프로젝트에 질문이 있어 글을 올립니다..
아직 코린이라서, 다소 두서 없을 수 있는 점,, 미리 양해드립니다..
1. 프로젝트 환경 : 프로그램은 Android Studio이고, Java언어로 개발하고 있습니다.
2. 프로젝트 내용 : 싸이월드 미니룸 꾸미기와 같은, 간단한 미니룸 꾸미기 게임
<InteriorActivity 실행화면>
우측 상단에 보시다시피, 카테고리별 인테리어 사진들을 갤러리 뷰로 생성한 상태입니다.
그리고 파란색으로 1이라고 되어 있는게, 갤러리뷰 중 아이템을 클릭했을 때, 생성된 ImageView입니다.
<ListAdapter 라는 이름으로 BaseAdapter를 상속받는 클래스입니다. 다른 중요한 내용은 없어서 getView만 올립니다>
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(context);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new Gallery.LayoutParams(150, 250));
imageView.setPadding(5, 5, 5, 5);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(drawIds[position]);
return imageView;
}
}
<그 다음, InteriorActivity 코드입니다 >
InteriorActivity 화면의 우측상단에 보이는 카테고리에, onClicked 이벤트를 줘서, 클릭시 해당 카테고리의 갤러리를 출력하고, 그 갤러리 중 하나를 클릭했을 때, 보시는 것 처럼 1번 자리에, 클린한 ImageView가 생성이 됩니다.
<여기 코드에서 goods는 1번 ImageView id입니다.>
public void onClicked (View view){
switch (view.getId()) {
case R.id.furniture:
adapter = new ListsAdapter(this, Data.furnitures);
gallery.setAdapter(adapter);
gallery.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
for (int i = 0; i < 100; i++) {
goods = new ImageView(getBaseContext());
goods.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
goods.setScaleX((float) 0.5);
goods.setScaleY((float) 0.5);
goods.setImageResource(Data.furnitures[position]);
layout.addView(goods);
goods.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
view1=v;
}
});
goods.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
float oldXvalue = 0;
float oldYvalue = 0;
int width = ((ViewGroup) v.getParent()).getWidth() - v.getWidth();
int height = ((ViewGroup) v.getParent()).getHeight() - v.getHeight();
if (event.getAction() == MotionEvent.ACTION_DOWN) {
oldXvalue = event.getX();
oldYvalue = event.getY();
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
v.setX(event.getRawX() - oldXvalue);
v.setY(event.getRawY() - (oldYvalue + v.getHeight()));
} else if (event.getAction() == MotionEvent.ACTION_UP) {//여기서 부터는 이제 위치를 설정할건데, 최종 위치에 제약걸기
if (v.getX() > width && v.getY() > height) { //??이게 무슨 말이지 == 최대값 인듯
v.setX(width);
v.setY(height);
} else if (v.getX() < 0 && v.getY() > height) {
v.setX(0);
v.setY(height);
} else if (v.getX() > width && v.getY() < 0) {
v.setX(width);
v.setY(0);
} else if (v.getX() < 0 && v.getY() < 0) {
v.setX(0);
v.setY(0);
} else if (v.getX() < 0 || v.getX() > width) {
if (v.getX() < 0) {
v.setX(0);
v.setY(event.getRawY() - oldYvalue - v.getHeight());
} else {
v.setX(width);
v.setY(event.getRawY() - oldYvalue - v.getHeight());
}
} else if (v.getY() < 0 || v.getY() > height) {
if (v.getY() < 0) {
v.setX(event.getRawX() - oldXvalue);
v.setY(0);
} else {
v.setX(event.getRawX() - oldXvalue);
v.setY(height);
}
}
}
v.invalidate();
return true;
}
});
}
}
});
break;
<이제 문제입니다..>
1번 클릭했을 때, 드래그 앤 드랍은 잘 됩니다만, 1번이 움직여서 다른 자리에 가게 하고 싶은데
1번은 가만히 있고, 1번이 복사가 되어서 다른 위치로 갑니다,,
1번이 복사가 되는게 아니라, 1번을 움직이게 하고 싶은데 어떻게 해야 할까요??
<연관된 또 다른 문제입니다.>
좌측 상단에 버튼 클릭시 확대, 축소, 로테이트 등등의 기능 이벤트를 클릭한 뷰에 적용시키고 싶은데,
제가 클릭한 놈한테 어떻게 적용시켜야 할지 도통 모르겠습니다..
뷰 생성시에 각각 tag나 id값을 줘서, 그거를 배열로 다 받아주는 것도 해봤고, 했는데, 진행을 못 시키겠더라고요 ㅠㅠ
염치없지만, 많은 도움 부탁드리겠습니다
1) 먼저 이미지가 여러 개 복사되는 현상에 대해서 예상되는 부분은
onItemClick() 메소드 부분에 있는 for문이 어떤 용도인지 모르겠습니다만
아래와 같이 for문이 돌면서 addView()를 여러번 실행하여 100개의 이미지가 겹쳐 써진 것이 아닌가 싶습니다.
즉, 이미지가 복사되는 것이 아니라 100개의 이미지가 겹쳐 그려져 있기 때문에 드래그해도 계속 이미지가 나타나 보이는 것 같습니다.
for문을 빼 보시거나 for문의 i < 100라고 되어있는 부분을 i < 2 로 바꿔보면 확인이 가능할 것 같습니다.
2) 그리고 클릭한 뷰에 액션을 적용하는 버튼을 만드는 방법에 대해서는 아래의 방식도 참고가 되지 않을까 싶습니다.
일단 currentSelectedView라는 이름으로 객체를 전역으로 선언해놓고
소스 상의 ACTION_UP 부분에 아래와 같이 현재 클릭한 뷰를 currentSelectedView에 저장합니다.
그리고 로테이트 버튼 등을 클릭했을 때 아래와 같이 처리하도록 합니다.