안드로이드 | [작업일지]아크메뉴 01

꾹 눌렸을 때, 해당 아이템에 대한 메뉴가 호 형태로 뜨는 메뉴가 필요 하다.
라이브러리를 찾아보니 두가지 정도 발견 할수 있었습니다.

https://github.com/daCapricorn/ArcMenu
https://github.com/ogaclejapan/ArcLayout/blob/master/library/src/main/java/com/ogaclejapan/arclayout/ArcLayout.java

image

흐름

우선 ItemView 에서 LongClick 이벤트를 받아야 한다. LongClick 이벤트로 눌린 화면의 좌표도 같이 받아와야 한다. 따라서 기존의 setOnLongClick 로 등록하는 리스너로는 사용이 불가능 했다. 따라서 ImageView 를 상속 받은 클래스에서 onTouchEvent 를 재정의하여 longClick 이벤트 상황을 만들어 콜백을 던져 주었다. 이때 clickListener 가 동작을 안하여 onTouchEvent 에서 기존 clickEvent 와 longClick 이벤트를 구현하여 콜백을 던져준다.

콜백 이벤트에 이제 터치된 좌표가 넘어 온다. 그 좌표를 이용하여 뒷배경을 흐리기 하고 아크메뉴를 그리고 적절히 애니메이션를 그린다. 이때 한가지더 중요한 사항이 롱클릭을 하고있을동안 메뉴가 나타나고 있으며 그 좌표에 따라서 어떤 메뉴가 선택중인지 표시를 해주어야 하며, 터치를 땔때 원하는 이벤트를 발생 시켜야 한다.

먼저..

롱클릭을 했을때 배경이 흐려지는것을 새로운 액티비티를 띄우도록 하였다. startActivity() 를 호출하고, 애니메이션으로 fade_out 을 주었다. 여기서 액티비티의 배경을 투명하게 하기 위해서는 manifest 에서 액티비티 속성으로 주어야 하는것이 있다.

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@color/transparency</item>

그리고 난 후, 액티비티(ArcActivity) 레이아웃에 FrameLayout을 하나 그리고 백그라운드 속성을 주어 투명도를 설정할수 있었다.그리고 이 FrameLayout 에 아크메뉴를 동적으로 위치를 추가를 해야 한다.

그리고 이벤트를 받고있는 뷰의 touch 이벤트에서 ACION_UP 이 될때, 이벤트를 날려서 ArcActivity 에서 받아 액티비티를 종료 시킨다. 그러면 롱클릭을 하는동안에는 투명한 ArcActivity 가 떠있고, 터치를 떼면 액티비가 종료 된다.

마찬가지로 액티비티가 떠있는동안에 터치이벤트를 받아야 하므로, 새로 정의한 뷰의터치이벤트의 ACTION_MOVE 에서도 이벤트를 날려 ArcActivity 에서 받아서 처음 롱클릭했던 위치와 터치되며 움직이는 좌표를 이용하여 아크 메뉴를 동작하도록 구현해야 한다.

comments powered by Disqus