Android Studio

[안드로이드-JAVA] 갤러리뷰에서 생성된 이미지뷰 드래그 앤 드랍

1
안녕하세요~ 코린이 입니다!! 현재 제가 공부하면서 만들고 있는 안드로이드 프로젝트에 질문이 있어 글을 올립니다.. 아직 코린이라서, 다소 두서 없을 수 있는 점,, 미리 양해드립니다..   1. 프로젝트 환경 : 프로그램은 Android St..

안녕하세요~ 코린이 입니다!!

현재 제가 공부하면서 만들고 있는 안드로이드 프로젝트에 질문이 있어 글을 올립니다..

아직 코린이라서, 다소 두서 없을 수 있는 점,, 미리 양해드립니다..

 

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개의 답변

1
1) 먼저 이미지가 여러 개 복사되는 현상에 대해서 예상되는 부분은 onItemClick() 메소드 부분에 있는 for문이 어떤 용도인지 모르겠습니다만 아래와 같이 for문이 돌면서 addView()를 여러번 실행하여 100개의 이미지가 겹쳐 써진 것..

1) 먼저 이미지가 여러 개 복사되는 현상에 대해서 예상되는 부분은

onItemClick() 메소드 부분에 있는 for문이 어떤 용도인지 모르겠습니다만

아래와 같이 for문이 돌면서 addView()를 여러번 실행하여 100개의 이미지가 겹쳐 써진 것이 아닌가 싶습니다.

for (int i = 0; i < 100; i++) {
    ...
    layout.addView(goods);
    ...
}

즉, 이미지가 복사되는 것이 아니라 100개의 이미지가 겹쳐 그려져 있기 때문에 드래그해도 계속 이미지가 나타나 보이는 것 같습니다.

for문을 빼 보시거나 for문의 i < 100라고 되어있는 부분을 i < 2 로 바꿔보면 확인이 가능할 것 같습니다.

 

2) 그리고 클릭한 뷰에 액션을 적용하는 버튼을 만드는 방법에 대해서는 아래의 방식도 참고가 되지 않을까 싶습니다.

일단 currentSelectedView라는 이름으로 객체를 전역으로 선언해놓고

소스 상의 ACTION_UP 부분에 아래와 같이 현재 클릭한 뷰를 currentSelectedView에 저장합니다.

...
} else if (event.getAction() == MotionEvent.ACTION_UP) {
    ...
    currentSelectedView = goods
    ...
}
...

그리고 로테이트 버튼 등을 클릭했을 때 아래와 같이 처리하도록 합니다.

if(currentSelectedView != null) {
    currentSelectedView.setRotation(90);
}

 

무린 2021-02-18
사탕 주기
무린 님께서 2021-02-18에 Android Studio에 올린 글
보관하기

댓글

조회수 932
답글 1
URL