1faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/* 2faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Copyright (C) 2013 The Android Open Source Project 3faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 4faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 5faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * you may not use this file except in compliance with the License. 6faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * You may obtain a copy of the License at 7faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 8faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * http://www.apache.org/licenses/LICENSE-2.0 9faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 10faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Unless required by applicable law or agreed to in writing, software 11faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * distributed under the License is distributed on an "AS IS" BASIS, 12faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * See the License for the specific language governing permissions and 14faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * limitations under the License. 15faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 166ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase 17d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haasepackage android.transition; 18faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 19faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.animation.Animator; 20faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.animation.ObjectAnimator; 21ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.content.Context; 22faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.graphics.drawable.ColorDrawable; 23faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.graphics.drawable.Drawable; 24ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.util.AttributeSet; 25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.View; 26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewGroup; 27faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.TextView; 28faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 29faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/** 30faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * This transition tracks changes during scene changes to the 31faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * {@link View#setBackground(android.graphics.drawable.Drawable) background} 32faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * property of its target views (when the background is a 33faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * {@link ColorDrawable}, as well as the 34faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * {@link TextView#setTextColor(android.content.res.ColorStateList) 35faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * color} of the text for target TextViews. If the color changes between 36faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * scenes, the color change is animated. 37d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * 38d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @hide 39faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 40faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haasepublic class Recolor extends Transition { 41faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 42faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase private static final String PROPNAME_BACKGROUND = "android:recolor:background"; 43faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase private static final String PROPNAME_TEXT_COLOR = "android:recolor:textColor"; 44faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 45ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount public Recolor() {} 46ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount 47ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount public Recolor(Context context, AttributeSet attrs) { 48ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount super(context, attrs); 49ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount } 50ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount 51d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase private void captureValues(TransitionValues transitionValues) { 52d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase transitionValues.values.put(PROPNAME_BACKGROUND, transitionValues.view.getBackground()); 53d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase if (transitionValues.view instanceof TextView) { 54d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase transitionValues.values.put(PROPNAME_TEXT_COLOR, 55d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase ((TextView)transitionValues.view).getCurrentTextColor()); 56faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 57faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 58faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 59faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 60d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public void captureStartValues(TransitionValues transitionValues) { 61d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase captureValues(transitionValues); 62d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 63d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 64d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 65d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public void captureEndValues(TransitionValues transitionValues) { 66d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase captureValues(transitionValues); 67d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 68d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 69d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 70d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, 71faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase TransitionValues endValues) { 72faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (startValues == null || endValues == null) { 732ea7f8b9c5f903050d42c1af57406bf528979f45Chet Haase return null; 74faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 75faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase final View view = endValues.view; 76faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase Drawable startBackground = (Drawable) startValues.values.get(PROPNAME_BACKGROUND); 77faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase Drawable endBackground = (Drawable) endValues.values.get(PROPNAME_BACKGROUND); 78faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase boolean changed = false; 79faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (startBackground instanceof ColorDrawable && endBackground instanceof ColorDrawable) { 80faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase ColorDrawable startColor = (ColorDrawable) startBackground; 81faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase ColorDrawable endColor = (ColorDrawable) endBackground; 82faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (startColor.getColor() != endColor.getColor()) { 83faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase endColor.setColor(startColor.getColor()); 84faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase changed = true; 851ffb280a7d2c70cc16d709c685f5d31fdb86b5e4George Mount return ObjectAnimator.ofArgb(endBackground, "color", startColor.getColor(), 861ffb280a7d2c70cc16d709c685f5d31fdb86b5e4George Mount endColor.getColor()); 87faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 88faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 89faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (view instanceof TextView) { 90faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase TextView textView = (TextView) view; 91faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase int start = (Integer) startValues.values.get(PROPNAME_TEXT_COLOR); 92faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase int end = (Integer) endValues.values.get(PROPNAME_TEXT_COLOR); 93faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (start != end) { 94faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase textView.setTextColor(end); 95faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase changed = true; 961ffb280a7d2c70cc16d709c685f5d31fdb86b5e4George Mount return ObjectAnimator.ofArgb(textView, "textColor", start, end); 97faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 98faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 992ea7f8b9c5f903050d42c1af57406bf528979f45Chet Haase return null; 100faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 101faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase} 102