Android Studio
[안드로이드-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값을 줘서, 그거를 배열로 다 받아주는 것도 해봤고, 했는데, 진행을 못 시키겠더라고요 ㅠㅠ

 

염치없지만, 많은 도움 부탁드리겠습니다 

댓글 1