Recolor.java revision 1ffb280a7d2c70cc16d709c685f5d31fdb86b5e4
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;
21faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.graphics.drawable.ColorDrawable;
22faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.graphics.drawable.Drawable;
23faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.View;
24faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewGroup;
25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.TextView;
26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
27faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/**
28faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * This transition tracks changes during scene changes to the
29faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * {@link View#setBackground(android.graphics.drawable.Drawable) background}
30faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * property of its target views (when the background is a
31faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * {@link ColorDrawable}, as well as the
32faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * {@link TextView#setTextColor(android.content.res.ColorStateList)
33faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * color} of the text for target TextViews. If the color changes between
34faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * scenes, the color change is animated.
35d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase *
36d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @hide
37faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */
38faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haasepublic class Recolor extends Transition {
39faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
40faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private static final String PROPNAME_BACKGROUND = "android:recolor:background";
41faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private static final String PROPNAME_TEXT_COLOR = "android:recolor:textColor";
42faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
43d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    private void captureValues(TransitionValues transitionValues) {
44d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        transitionValues.values.put(PROPNAME_BACKGROUND, transitionValues.view.getBackground());
45d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        if (transitionValues.view instanceof TextView) {
46d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            transitionValues.values.put(PROPNAME_TEXT_COLOR,
47d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                    ((TextView)transitionValues.view).getCurrentTextColor());
48faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
49faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
50faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
51faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
52d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureStartValues(TransitionValues transitionValues) {
53d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        captureValues(transitionValues);
54d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
55d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
56d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
57d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureEndValues(TransitionValues transitionValues) {
58d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        captureValues(transitionValues);
59d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
60d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
61d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
62d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
63faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            TransitionValues endValues) {
64faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (startValues == null || endValues == null) {
652ea7f8b9c5f903050d42c1af57406bf528979f45Chet Haase            return null;
66faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
67faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        final View view = endValues.view;
68faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        Drawable startBackground = (Drawable) startValues.values.get(PROPNAME_BACKGROUND);
69faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        Drawable endBackground = (Drawable) endValues.values.get(PROPNAME_BACKGROUND);
70faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        boolean changed = false;
71faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (startBackground instanceof ColorDrawable && endBackground instanceof ColorDrawable) {
72faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            ColorDrawable startColor = (ColorDrawable) startBackground;
73faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            ColorDrawable endColor = (ColorDrawable) endBackground;
74faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            if (startColor.getColor() != endColor.getColor()) {
75faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                endColor.setColor(startColor.getColor());
76faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                changed = true;
771ffb280a7d2c70cc16d709c685f5d31fdb86b5e4George Mount                return ObjectAnimator.ofArgb(endBackground, "color", startColor.getColor(),
781ffb280a7d2c70cc16d709c685f5d31fdb86b5e4George Mount                        endColor.getColor());
79faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
80faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
81faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (view instanceof TextView) {
82faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            TextView textView = (TextView) view;
83faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            int start = (Integer) startValues.values.get(PROPNAME_TEXT_COLOR);
84faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            int end = (Integer) endValues.values.get(PROPNAME_TEXT_COLOR);
85faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            if (start != end) {
86faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                textView.setTextColor(end);
87faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                changed = true;
881ffb280a7d2c70cc16d709c685f5d31fdb86b5e4George Mount                return ObjectAnimator.ofArgb(textView, "textColor", start, end);
89faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
90faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
912ea7f8b9c5f903050d42c1af57406bf528979f45Chet Haase        return null;
92faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
93faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase}
94