Home | History | Annotate | Download | only in views
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.systemui.recents.views;
     18 
     19 import android.animation.ValueAnimator;
     20 import android.graphics.Rect;
     21 import android.view.View;
     22 import android.view.ViewPropertyAnimator;
     23 import android.view.animation.Interpolator;
     24 import com.android.systemui.recents.Constants;
     25 
     26 
     27 /* The transform state for a task view */
     28 public class TaskViewTransform {
     29     public int startDelay = 0;
     30     public int translationY = 0;
     31     public float translationZ = 0;
     32     public float scale = 1f;
     33     public float alpha = 1f;
     34     public boolean visible = false;
     35     public Rect rect = new Rect();
     36     float p = 0f;
     37 
     38     public TaskViewTransform() {
     39         // Do nothing
     40     }
     41 
     42     public TaskViewTransform(TaskViewTransform o) {
     43         startDelay = o.startDelay;
     44         translationY = o.translationY;
     45         translationZ = o.translationZ;
     46         scale = o.scale;
     47         alpha = o.alpha;
     48         visible = o.visible;
     49         rect.set(o.rect);
     50         p = o.p;
     51     }
     52 
     53     /** Resets the current transform */
     54     public void reset() {
     55         startDelay = 0;
     56         translationY = 0;
     57         translationZ = 0;
     58         scale = 1f;
     59         alpha = 1f;
     60         visible = false;
     61         rect.setEmpty();
     62         p = 0f;
     63     }
     64 
     65     /** Convenience functions to compare against current property values */
     66     public boolean hasAlphaChangedFrom(float v) {
     67         return (Float.compare(alpha, v) != 0);
     68     }
     69     public boolean hasScaleChangedFrom(float v) {
     70         return (Float.compare(scale, v) != 0);
     71     }
     72     public boolean hasTranslationYChangedFrom(float v) {
     73         return (Float.compare(translationY, v) != 0);
     74     }
     75     public boolean hasTranslationZChangedFrom(float v) {
     76         return (Float.compare(translationZ, v) != 0);
     77     }
     78 
     79     /** Applies this transform to a view. */
     80     public void applyToTaskView(View v, int duration, Interpolator interp, boolean allowLayers,
     81             boolean allowShadows, ValueAnimator.AnimatorUpdateListener updateCallback) {
     82         // Check to see if any properties have changed, and update the task view
     83         if (duration > 0) {
     84             ViewPropertyAnimator anim = v.animate();
     85             boolean requiresLayers = false;
     86 
     87             // Animate to the final state
     88             if (hasTranslationYChangedFrom(v.getTranslationY())) {
     89                 anim.translationY(translationY);
     90             }
     91             if (allowShadows && hasTranslationZChangedFrom(v.getTranslationZ())) {
     92                 anim.translationZ(translationZ);
     93             }
     94             if (hasScaleChangedFrom(v.getScaleX())) {
     95                 anim.scaleX(scale)
     96                     .scaleY(scale);
     97                 requiresLayers = true;
     98             }
     99             if (hasAlphaChangedFrom(v.getAlpha())) {
    100                 // Use layers if we animate alpha
    101                 anim.alpha(alpha);
    102                 requiresLayers = true;
    103             }
    104             if (requiresLayers && allowLayers) {
    105                 anim.withLayer();
    106             }
    107             if (updateCallback != null) {
    108                 anim.setUpdateListener(updateCallback);
    109             } else {
    110                 anim.setUpdateListener(null);
    111             }
    112             anim.setStartDelay(startDelay)
    113                     .setDuration(duration)
    114                     .setInterpolator(interp)
    115                     .start();
    116         } else {
    117             // Set the changed properties
    118             if (hasTranslationYChangedFrom(v.getTranslationY())) {
    119                 v.setTranslationY(translationY);
    120             }
    121             if (allowShadows && hasTranslationZChangedFrom(v.getTranslationZ())) {
    122                 v.setTranslationZ(translationZ);
    123             }
    124             if (hasScaleChangedFrom(v.getScaleX())) {
    125                 v.setScaleX(scale);
    126                 v.setScaleY(scale);
    127             }
    128             if (hasAlphaChangedFrom(v.getAlpha())) {
    129                 v.setAlpha(alpha);
    130             }
    131         }
    132     }
    133 
    134     /** Reset the transform on a view. */
    135     public static void reset(View v) {
    136         v.setTranslationX(0f);
    137         v.setTranslationY(0f);
    138         v.setTranslationZ(0f);
    139         v.setScaleX(1f);
    140         v.setScaleY(1f);
    141         v.setAlpha(1f);
    142     }
    143 
    144     @Override
    145     public String toString() {
    146         return "TaskViewTransform delay: " + startDelay + " y: " + translationY + " z: " + translationZ +
    147                 " scale: " + scale + " alpha: " + alpha + " visible: " + visible + " rect: " + rect +
    148                 " p: " + p;
    149     }
    150 }
    151