반응형
공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
이번 포스팅에서는 안드로이드의 드래그 앤 드랍에 대해 포스팅합니다.
View.OnDragListener 와 View.OnTouchListener 가 사용됩니다.
예제)
SampleActivity.java
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | package superbrain.rowan.com.fingerdraganddrawexample; import android.content.ClipData; import android.content.ClipDescription; import android.databinding.DataBindingUtil; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.DragEvent; import android.view.MotionEvent; import android.view.View; import superbrain.rowan.com.fingerdraganddrawexample.databinding.ActivitySampleBinding; public class SampleActivity extends AppCompatActivity { ActivitySampleBinding binding; float fromX, fromY; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_sample); binding.moveTxtView.setTag("good"); binding.motherView.setOnDragListener(drag); binding.moveTxtView.setOnTouchListener((view, evt) -> { int action = evt.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: if (view != null) { String tag = view.getTag().toString(); ClipData.Item item = new ClipData.Item((CharSequence) view.getTag()); String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN}; ClipData data = new ClipData(tag, mimeTypes, item); fromX = evt.getX(); fromY = evt.getY(); View.DragShadowBuilder builder = new View.DragShadowBuilder(view); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { view.startDragAndDrop(data, builder, null, 0); } else { view.startDrag(data, builder, null, 0); } } break; } return view.performClick(); }); } View.OnDragListener drag = (view, evt) -> { int id = view.getId(); int action = evt.getAction(); switch (action) { case DragEvent.ACTION_DROP: if (id == R.id.motherView) { float x = evt.getX() - (binding.moveTxtView.getWidth() / 2); float y = evt.getY() - (binding.moveTxtView.getHeight() / 2); binding.moveTxtView.setX(x); binding.moveTxtView.setY(y); } break; } return true; }; } | cs |
activity_sample.xml
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 | <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <android.support.constraint.ConstraintLayout android:id="@+id/motherView" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".SampleActivity"> <TextView app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:id="@+id/moveTxtView" android:textColor="@android:color/white" android:background="@android:color/black" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="28sp" android:padding="8dp" android:text="move"/> </android.support.constraint.ConstraintLayout> </layout> | cs |
위 코드를 복붙하시고 실행하시면 바로 드래그 앤 드랍 이벤트를 테스트해 보실 수
있습니다.
드래그 앤 드랍을 이해하고 사용할 줄 안다면 안드로이드의 많은 부분들을
해결할 수 있겠죠?
가령 간단한 게임 중 숫자 여러개가 나오고 순서대로 옮기는 게임이라던가 ㅎㅎ
어렵지 않으니 사용법을 익혀두시면 좋을 듯합니다.
이상입니다.
감사합니다.
반응형
'안드로이드' 카테고리의 다른 글
안드로이드 RecyclerView.Decoration , recyclerView item 간격 설정 (0) | 2018.12.14 |
---|---|
안드로이드 선 그리기, FingerDraw, drawline, canvas, setOntTouchListener (0) | 2018.12.11 |
안드로이드 RecyclerView 스크롤 효과 안되게 막기 (0) | 2018.12.06 |
안드로이드 RecyclerView Grid 형태로 쓸 때 아이템들 가로세로 크기 동일하게 만드는 방법. ViewTreeObserver.OnGlobalLayoutListener(), getTreeViewObserver() (0) | 2018.12.03 |
안드로이드 이미지 때문에 액티비티 로딩속도가 느릴 때 간단한 해결방법 (0) | 2018.11.30 |