woong's
Android Activity Transition Circle 사용하기 [3] 본문
Android Activity Transition Circle 사용하기 [3]
이번 포스트에서는 circle Transition을 추가해 보려 합니다.
저번 포스트에서는 이미지 뷰를 Transition 하는것까지 해보았는데 circle 까지만 추가해도
어느정도 구성을 갖추게 되는것 같습니다.
포스트는 [1] 번 샘플 코드를 전체로 진행 됩니다.
1. 사용준비
사용하기전에 circle Animation이 필요 합니다.
아래 두가지 파일이 필요 합니다.
1. WeapperAnimator
2. RevealTransition
1. WeapperAnimator
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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | public class WrapperAnimator extends Animator { private final Animator mWrappedAnimator; public WrapperAnimator(Animator wrappedAnimator) { mWrappedAnimator = wrappedAnimator; } @Override public long getStartDelay() { return mWrappedAnimator.getStartDelay(); } @Override public void setStartDelay(long startDelay) { mWrappedAnimator.setStartDelay(startDelay); } @Override public Animator setDuration(long duration) { mWrappedAnimator.setDuration(duration); return this; } @Override public long getDuration() { return mWrappedAnimator.getDuration(); } @Override public void setInterpolator(TimeInterpolator value) { mWrappedAnimator.setInterpolator(value); } @Override public boolean isRunning() { return mWrappedAnimator.isRunning(); } @Override public void start() { mWrappedAnimator.start(); } @Override public void cancel() { mWrappedAnimator.cancel(); } @Override public void pause() { if (!isRevealAnimator()) { mWrappedAnimator.pause(); } else { } } @Override public void resume() { if (!isRevealAnimator()) { mWrappedAnimator.resume(); } else { } } @Override public void addListener(AnimatorListener listener) { mWrappedAnimator.addListener(listener); } @Override public void removeAllListeners() { mWrappedAnimator.removeAllListeners(); } @Override public void removeListener(AnimatorListener listener) { mWrappedAnimator.removeListener(listener); } private boolean isRevealAnimator() { return mWrappedAnimator.getClass().getName().contains("RevealAnimator"); } } | cs |
2. RevealTransition
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 | public class RevealTransition extends Visibility { private final Point mEpicenter; private final int mSmallRadius; private final int mBigRadius; private final long mDuration; public RevealTransition(Point epicenter, int smallRadius, int bigRadius, long duration) { mEpicenter = epicenter; mSmallRadius = smallRadius; mBigRadius = bigRadius; mDuration = duration; } @Override public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) { Animator animator = ViewAnimationUtils.createCircularReveal(view, mEpicenter.x, mEpicenter.y, mSmallRadius, mBigRadius); animator.setDuration(mDuration); return new WrapperAnimator(animator); } @Override public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) { Animator animator = ViewAnimationUtils.createCircularReveal(view, mEpicenter.x, mEpicenter.y, mBigRadius, mSmallRadius); animator.setDuration(mDuration); return new WrapperAnimator(animator); } } | cs |
2. 사용방법
위 두클래스를 준비하면 이제 사용준비가 완료 되었습니다.
이제 사용방법에 대해 알아 보겠습니다.
원을 그려주기위해서 선택한 사진의 중심값을 알아야 합니다. 중심값을 detailActivity로 전달하는 코드가 필요 합니다.
MainActivity
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 | /** * 앨범 리싸이클러 뷰 선택 시 */ private AlbumViewHolderListener mAlbumViewHolderListener = new AlbumViewHolderListener(){ @Override public void onClicked(AlbumListAdapter.AlbumViewHolder albumViewHolder, int position) { int albumArtResId = albumList.get(position); Intent intent = new Intent(MainActivity.this, AlbumDetailActivity.class); intent.putExtra(AlbumDetailActivity.EXTRA_ALBUM_ART_RESID, albumArtResId); int[] location = new int[2]; albumViewHolder.imgAlbum.getLocationInWindow(location); Point epicenter = new Point(location[0] + albumViewHolder.imgAlbum.getMeasuredWidth() / 2, location[1] + albumViewHolder.imgAlbum.getMeasuredHeight() / 2); intent.putExtra(AlbumDetailActivity.EXTRA_EPICENTER, epicenter); ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, albumViewHolder.imgAlbum, albumViewHolder.imgAlbum.getTransitionName()); startActivity(intent, options.toBundle()); } }; | cs |
위코드 중앙의 좌표값을 넘기는 코드가 있습니다.
넘긴 좌표값을 이용해서 원 애니메이션을 적용해야 합니다.
DetailActivity
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /** * 화면 전환 애니메이션 초기화 */ private void initTransitions() { Window window = getWindow(); RevealTransition reveal = createRevealTransition(); window.setEnterTransition(reveal); } /** * 원형 만드는 기능 * @return */ private RevealTransition createRevealTransition() { Point epicenter = getIntent().getParcelableExtra(EXTRA_EPICENTER); DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); int bigRadius = Math.max(displayMetrics.widthPixels, displayMetrics.heightPixels); RevealTransition reveal = new RevealTransition(epicenter, 0, bigRadius, 500); return reveal; } | cs |
createRecealTransition() 함수를 보면 mainActivity 에서 넘어온 좌표값을 받습니다.
받은 좌표값과 , display 화면 값을 통하여 사용준비에서 준비한 원 애니메이션에 값을 넣어 주면 되겠습니다.
마지막으로
activity_album_detail.xml
1 2 3 4 | <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/colorPrimary"> | cs |
스크롤 뷰 하단 뷰에 배경색상을 넣으면 이쁜 원형이 나타나는것을 확인 할수 있습니다.
설정후에 initTransitions() 함수를 호출해주면 선택한 사진이 이동하면서 원형 애니메이션이 진행 됩니다.
다른뷰들로 인해서 원형 애니메이션이 부자연 스러워 보일수 있습니다.
이미지 버튼 , 하단 레이아웃을 비활성화 하고 확인해보세요.
'Develop > Android' 카테고리의 다른 글
Android Custom Gallery 샘플 구성 하기 (2) | 2016.02.14 |
---|---|
Android lolipop widget v7 사용하기 (0) | 2016.02.14 |
Android Activity Transition ImageView 이동하기 [2] (0) | 2016.02.14 |
Android Activity Transition 샘플 & 소개하기 [1] (0) | 2016.02.14 |
Android Support Design NavigationView 사용하기[4] (0) | 2016.02.14 |