1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14 package com.example.android.leanback; 15 16 import android.animation.Animator; 17 import android.animation.AnimatorListenerAdapter; 18 import android.animation.AnimatorSet; 19 import android.animation.ObjectAnimator; 20 import android.graphics.drawable.AnimationDrawable; 21 import android.support.v17.leanback.app.OnboardingFragment; 22 import android.view.LayoutInflater; 23 import android.view.View; 24 import android.view.ViewGroup; 25 import android.widget.ImageView; 26 27 import java.util.ArrayList; 28 29 public class OnboardingDemoFragment extends OnboardingFragment { 30 private static final long ANIMATION_DURATION = 1000; 31 32 private static final int[] CONTENT_BACKGROUNDS = { 33 R.drawable.tv_bg, 34 R.drawable.gallery_photo_6, 35 R.drawable.gallery_photo_8 36 }; 37 38 private static final int[] CONTENT_ANIMATIONS = { 39 R.drawable.tv_content, 40 android.R.drawable.stat_sys_download, 41 android.R.drawable.ic_popup_sync 42 }; 43 44 private String[] mTitles; 45 private String[] mDescriptions; 46 47 private View mBackgroundView; 48 private View mContentView; 49 private ImageView mContentBackgroundView; 50 private ImageView mContentAnimationView; 51 52 private Animator mContentAnimator; 53 54 @Override onAttach(android.app.Activity activity)55 public void onAttach(android.app.Activity activity) { 56 super.onAttach(activity); 57 mTitles = getResources().getStringArray(R.array.onboarding_page_titles); 58 mDescriptions = getResources().getStringArray(R.array.onboarding_page_descriptions); 59 setLogoResourceId(R.drawable.ic_launcher); 60 } 61 62 @Override getPageCount()63 protected int getPageCount() { 64 return mTitles.length; 65 } 66 67 @Override getPageTitle(int i)68 protected CharSequence getPageTitle(int i) { 69 return mTitles[i]; 70 } 71 72 @Override getPageDescription(int i)73 protected CharSequence getPageDescription(int i) { 74 return mDescriptions[i]; 75 } 76 77 @Override onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup)78 protected View onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) { 79 mBackgroundView = layoutInflater.inflate(R.layout.onboarding_image, viewGroup, false); 80 return mBackgroundView; 81 } 82 83 @Override onCreateContentView(LayoutInflater layoutInflater, ViewGroup viewGroup)84 protected View onCreateContentView(LayoutInflater layoutInflater, ViewGroup viewGroup) { 85 mContentView = layoutInflater.inflate(R.layout.onboarding_content, viewGroup, false); 86 mContentBackgroundView = (ImageView) mContentView.findViewById(R.id.background_image); 87 mContentAnimationView = (ImageView) mContentView.findViewById(R.id.animation_image); 88 return mContentView; 89 } 90 91 @Override onCreateForegroundView(LayoutInflater layoutInflater, ViewGroup viewGroup)92 protected View onCreateForegroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) { 93 return null; 94 } 95 96 @Override onCreateEnterAnimation()97 protected Animator onCreateEnterAnimation() { 98 ArrayList<Animator> animators = new ArrayList<>(); 99 animators.add(createFadeInAnimator(mBackgroundView)); 100 mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[0]); 101 mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[0]); 102 mContentAnimator = createFadeInAnimator(mContentView); 103 animators.add(mContentAnimator); 104 AnimatorSet set = new AnimatorSet(); 105 set.playTogether(animators); 106 set.addListener(new AnimatorListenerAdapter() { 107 @Override 108 public void onAnimationEnd(Animator animation) { 109 ((AnimationDrawable) mContentAnimationView.getDrawable()).start(); 110 } 111 }); 112 return set; 113 } 114 115 @Override onPageChanged(final int newPage, int previousPage)116 protected void onPageChanged(final int newPage, int previousPage) { 117 if (mContentAnimator != null) { 118 mContentAnimator.cancel(); 119 } 120 ((AnimationDrawable) mContentAnimationView.getDrawable()).stop(); 121 ArrayList<Animator> animators = new ArrayList<>(); 122 Animator fadeOut = createFadeOutAnimator(mContentView); 123 fadeOut.addListener(new AnimatorListenerAdapter() { 124 @Override 125 public void onAnimationEnd(Animator animation) { 126 mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[newPage]); 127 mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[newPage]); 128 } 129 }); 130 Animator fadeIn = createFadeInAnimator(mContentView); 131 fadeIn.addListener(new AnimatorListenerAdapter() { 132 @Override 133 public void onAnimationEnd(Animator animation) { 134 ((AnimationDrawable) mContentAnimationView.getDrawable()).start(); 135 } 136 }); 137 AnimatorSet set = new AnimatorSet(); 138 set.playSequentially(fadeOut, fadeIn); 139 set.start(); 140 mContentAnimator = set; 141 } 142 createFadeInAnimator(View view)143 private Animator createFadeInAnimator(View view) { 144 return ObjectAnimator.ofFloat(view, View.ALPHA, 0.0f, 1.0f).setDuration(ANIMATION_DURATION); 145 } 146 createFadeOutAnimator(View view)147 private Animator createFadeOutAnimator(View view) { 148 return ObjectAnimator.ofFloat(view, View.ALPHA, 1.0f, 0.0f).setDuration(ANIMATION_DURATION); 149 } 150 151 @Override onFinishFragment()152 protected void onFinishFragment() { 153 getActivity().finish(); 154 } 155 } 156