[안드로이드-JAVA] 갤러리뷰에서 생성된 이미지뷰 드래그 앤 드랍
안녕하세요~ 코린이 입니다!!
현재 제가 공부하면서 만들고 있는 안드로이드 프로젝트에 질문이 있어 글을 올립니다..
아직 코린이라서, 다소 두서 없을 수 있는 점,, 미리 양해드립니다..
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값을 줘서, 그거를 배열로 다 받아주는 것도 해봤고, 했는데, 진행을 못 시키겠더라고요 ㅠㅠ
염치없지만, 많은 도움 부탁드리겠습니다
댓글