티스토리 뷰

android

drag & drop 처리

Shin_lab 2016. 2. 22. 17:09

오늘은 gridView나 listView같이 item이 여러개 들어있는 뷰에서 drag & drop을 하는 부분에 대해 간단하게 설명하겠습니다.


before Item drag 

// item의 bitmap을 얻어오기 위해 setDrawingCacheEnagled()을 통해 drawing cache에 업데이트 된 뷰의 정보를 저장하게 됩니다. 그리고 getDrawingCache()를 통해 캡쳐된 bitmap을 가져오게 됩니다. 이 부분은 WindowManager로 FloatingView를 만들고 bitmap을 가져오는 부분을 보면 됩니다. setDrawingCacheEnabled(true) 후에 setDrawingCacheEnabled(false)를 하지 않게 되면 floatingView에 잘못된 비트맵 이미지가 띄워질 수가 있습니다.

View item = getChildAt(itemIndex);

item.setDrawingCacheEnabled(true);

Bitmap bitmap = Bitmap.createBitmap(item.getDrawingCache());

        

WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams();

windowParams.gravity = Gravity.LEFT | Gravity.TOP;

windowParams.x = (int) (x);

windowParams.y = (int) (y);

windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;

windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;

windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE

| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE

| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN

| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;

windowParams.format = PixelFormat.TRANSLUCENT;

windowParams.windowAnimations = 0;

        

ImageView floatingView = new ImageView(mContext);

floatingView.setImageBitmap(bitmap);

        

WindowManager mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);

mWindowManager.addView(floatingView, windowParams);

mFloatingView = floatingView;

        

item.setDrawingCacheEnabled(false);


Item drag

// 이 부분은 ACTION_MOVE를 통해 drag를 하는 부분으로 floatingView의 위치를 바꿔주는 부분입니다.

WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams)mFloatingView.getLayoutParams();

layoutParams.x = (int) (x);

layoutParams.y = (int) (y);

WindowManager mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);

mWindowManager.updateViewLayout(mFloatingView, layoutParams);


Item drop

// 이 부분은 ACTION_UP이나 ACTION_CANCEL을 통해 drag를 마치는 부분으로 floatingView의 제거를 하게 됩니다.

mFloatingView.setVisibility(GONE);            

WindowManager windowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);

windowManager.removeView(mFloatingView);

mFloatingView.setImageDrawable(null);

mFloatingView = null;