티스토리 뷰
오늘은 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;
'android' 카테고리의 다른 글
[Android / RecyclerView] #2 밀어서 아이템 삭제 구현 (0) | 2020.02.05 |
---|---|
[Android / Recycler View] #1 기본 타입 구현 (0) | 2020.02.05 |
[UI] 원을 따라 움직이는 버튼 구현 (0) | 2016.03.21 |
[UI] bottom-up slide view (0) | 2016.03.06 |
eclipse에서 appcompat_v7 support library 제거하기 (0) | 2016.03.06 |
- Total
- Today
- Yesterday
- 리사이클러뷰 확장
- git server
- build server
- RecyclerView
- weak_ptr
- data transfer
- serializable
- kotlinx serialization
- git hook
- delete item
- swip
- Jenkins
- publish opensource
- qtwebengine
- Apache
- 자동 배포
- ubuntu 16.04
- Git
- Parcelable
- jitpack
- android open source
- kotlin
- remove item
- android serialization
- type inference
- C++
- 오픈 소스 배포
- expandable recyclerview
- auto depoly
- security.ubuntu.com
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |