Shared elements

머티리얼 화면 전환, Shared Elements

  • 플레이스토어에서 앱을 선택하면 리스트의 이미지가 스르르하면서 커지면서 화면 전환이 발생
  • 처음에는 엄청난 라이브러리를 사용한지 알았지만 안드로이드 기본을 이용하면 된다.
  • 안드로이는 구현보다 무엇을 사용하지만 알면 금방 적용 할수 있습니다.
  • 일단 처음 발견한 링크 입니다.
  • 위 링크를 보고 사용하는 내용이 shared-elements 라는것을 알고 사용하기로 함
  • 5.0 이상만 가능하지만 이제는 5.0 미만에서의 애니메이션은 신경 안쓰기로 결정함
  • shared-elements 를 키워드로 검색
  • 안드로이드 개발자 사이트 참고 링크
  • 다른 사람이 만든 공부하기 쉬운 샘플코드
  • 프래그먼트에서 프래그먼트로 이동할 때 만 적어 보겠습니다.
    • 각각의 상황에 맞는 내용은 위 링크 샘플에 잘 정리 되어 있습니다.
  • A 프래그먼트에 이미지 뷰를 추가

    ``` xml

    ```

    • android:transitionName 속성이 2번째 프래그먼트에도 동일하게 사용됩니다.
  • A 프래그먼트 에서 B 프래그먼트 생성 및 A 프래그먼트 삭제
    • 참고 addToBackStack(TAG) 을 이용해서 뒤로가기 가능하도록 가능합니다.(플레이스토어 처럼 반대 애니메이션 동작 합니다.)
      val mainFragment = MainFragment.newInstance("")
      supportFragmentManager
                .beginTransaction()
                .addSharedElement(img, ViewCompat.getTransitionName(img))
                .remove(intro)
                .replace(R.id.contentFrame, mainFragment)                
                .commit()
    
  • 여기서 중요한건 아래 내용입니다.
    • .addSharedElement(img, ViewCompat.getTransitionName(img))
    • img 는 A 프래그먼트의 ImageView 객체 입니다.
    • 메소드명처럼 엘레먼트를 전달하여 B 프래그먼트에서 활용 하는걸로 보입니다
  • B 프래그먼트
    • onCreate 생성자에 아래 내용을 추가해 줍니다.
    • transition.move 를 수정하면 다양한 효과가 있을거라 생각하지만 move 로 충분 했습니다.
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                sharedElementEnterTransition = TransitionInflater.from(context).inflateTransition(android.R.transition.move)
            }
        }
    
    • B 프래그먼트에 이미지뷰 추가
    • 이번에도 transitionName 필드에 주의해 주세요
    • 사이즈를 고정한건 이동하면서 객체가 작아지는걸 볼려고 추가한 내용입니다.

      ``` xml

    ``` - 여기까지 추가 하면 기본적인 동작을 확인 가능합니다. - 좀더 많은 내용은 중간에 추가된 샘플이 좋습니다.

PyeongHo

즐겁게 또 즐겁게