19420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase/*
29420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase * Copyright (C) 2012 The Android Open Source Project
39420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase *
49420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase * Licensed under the Apache License, Version 2.0 (the "License");
59420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase * you may not use this file except in compliance with the License.
69420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase * You may obtain a copy of the License at
79420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase *
89420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase *      http://www.apache.org/licenses/LICENSE-2.0
99420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase *
109420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase * Unless required by applicable law or agreed to in writing, software
119420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase * distributed under the License is distributed on an "AS IS" BASIS,
129420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase * See the License for the specific language governing permissions and
149420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase * limitations under the License.
159420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase */
169420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haasepackage com.android.test.hwui;
179420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
189420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.animation.ObjectAnimator;
199420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.animation.ValueAnimator;
209420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.app.Activity;
219420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.content.Context;
229420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.os.Bundle;
239420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.util.AttributeSet;
249420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.view.View;
259420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.view.animation.AlphaAnimation;
269420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.view.animation.Animation;
279420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.view.animation.Transformation;
289420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.view.animation.TranslateAnimation;
299420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.widget.Button;
309420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.widget.CheckBox;
319420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.widget.CompoundButton;
329420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.widget.LinearLayout;
339420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
349420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haasepublic class TransformsAndAnimationsActivity extends Activity {
359420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button1;
369420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button2;
379420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button3;
389420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button1a;
399420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button2a;
409420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button3a;
419420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button1b;
429420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button2b;
439420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button3b;
449420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button4;
459420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button5;
469420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button6;
479420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button7;
489420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    Button button8;
499420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    CheckBox layersNoneCB;
509420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    CheckBox layersHardwareCB;
519420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    CheckBox layersSoftwareCB;
529420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
539420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    @Override
549420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    protected void onCreate(Bundle savedInstanceState) {
559420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        super.onCreate(savedInstanceState);
569420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        setContentView(R.layout.transforms_and_animations);
579420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
589420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button1 = (Button) findViewById(R.id.button1);
599420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button2 = (Button) findViewById(R.id.button2);
609420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button3 = (Button) findViewById(R.id.button3);
619420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button1a = (Button) findViewById(R.id.button1a);
629420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button2a = (Button) findViewById(R.id.button2a);
639420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button3a = (Button) findViewById(R.id.button3a);
649420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button1b = (Button) findViewById(R.id.button1b);
659420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button2b = (Button) findViewById(R.id.button2b);
669420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button3b = (Button) findViewById(R.id.button3b);
679420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button4 = (Button) findViewById(R.id.button4);
689420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button5 = (Button) findViewById(R.id.button5);
699420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button6 = (Button) findViewById(R.id.button6);
709420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button7 = (Button) findViewById(R.id.button7);
719420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button8 = (Button) findViewById(R.id.button8);
729420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        layersNoneCB = (CheckBox) findViewById(R.id.layersNoneCB);
739420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        layersHardwareCB = (CheckBox) findViewById(R.id.layersHwCB);
749420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        layersSoftwareCB = (CheckBox) findViewById(R.id.layersSwCB);
759420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
769420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        layersNoneCB.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
779420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            @Override
789420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
799420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                if (isChecked) {
809420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    setLayerType(View.LAYER_TYPE_NONE);
819420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    layersHardwareCB.setChecked(false);
829420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    layersSoftwareCB.setChecked(false);
839420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                }
849420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            }
859420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        });
869420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
879420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        layersSoftwareCB.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
889420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            @Override
899420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
909420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                if (isChecked) {
919420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    setLayerType(View.LAYER_TYPE_SOFTWARE);
929420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    layersHardwareCB.setChecked(false);
939420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    layersNoneCB.setChecked(false);
949420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                }
959420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            }
969420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        });
979420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
989420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        layersHardwareCB.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
999420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            @Override
1009420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1019420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                if (isChecked) {
1029420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    setLayerType(View.LAYER_TYPE_HARDWARE);
1039420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    layersNoneCB.setChecked(false);
1049420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    layersSoftwareCB.setChecked(false);
1059420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                }
1069420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            }
1079420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        });
1089420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1099420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button1a.setAlpha(.5f);
1109420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button2a.setAlpha(.5f);
1119420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button3a.setAlpha(.5f);
1129420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button3.setTranslationX(50);
1139420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button7.setTranslationX(50);
1149420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button8.setTranslationX(50);
1159420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1169420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        final AlphaAnimation alphaAnim = new AlphaAnimation(1, 0);
1179420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        alphaAnim.setDuration(1000);
1189420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        alphaAnim.setRepeatCount(Animation.INFINITE);
1199420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        alphaAnim.setRepeatMode(Animation.REVERSE);
1209420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1219420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        final TranslateAnimation transAnim = new TranslateAnimation(0, -50, 0, 0);
1229420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        transAnim.setDuration(1000);
1239420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        transAnim.setRepeatCount(Animation.INFINITE);
1249420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        transAnim.setRepeatMode(Animation.REVERSE);
1259420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1269420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        getWindow().getDecorView().postDelayed(new Runnable() {
1279420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            @Override
1289420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            public void run() {
1299420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                button1.startAnimation(alphaAnim);
1309420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                button2.startAnimation(alphaAnim);
1319420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                button3.startAnimation(alphaAnim);
1329420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1339420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                button1a.startAnimation(alphaAnim);
1349420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                button2a.startAnimation(alphaAnim);
1359420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                button3a.startAnimation(alphaAnim);
1369420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1379420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                button1b.startAnimation(alphaAnim);
1389420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                button2b.startAnimation(alphaAnim);
1399420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                button3b.startAnimation(alphaAnim);
1409420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                startAnimator(button1b);
1419420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                startAnimator(button2b);
1429420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                startAnimator(button3b);
1439420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1449420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                button7.startAnimation(transAnim);
1459420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                button8.startAnimation(transAnim);
1469420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            }
1479420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        }, 2000);
1489420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    }
1499420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1509420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    private void setLayerType(int layerType) {
1519420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button1.setLayerType(layerType, null);
1529420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button2.setLayerType(layerType, null);
1539420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button3.setLayerType(layerType, null);
1549420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button1a.setLayerType(layerType, null);
1559420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button2a.setLayerType(layerType, null);
1569420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button3a.setLayerType(layerType, null);
1579420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button1b.setLayerType(layerType, null);
1589420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button2b.setLayerType(layerType, null);
1599420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button3b.setLayerType(layerType, null);
1609420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button4.setLayerType(layerType, null);
1619420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button5.setLayerType(layerType, null);
1629420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button6.setLayerType(layerType, null);
1639420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button7.setLayerType(layerType, null);
1649420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        button8.setLayerType(layerType, null);
1659420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    }
1669420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1679420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    private void startAnimator(View target) {
1689420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        ObjectAnimator anim1b = ObjectAnimator.ofFloat(target, View.ALPHA, 0);
1699420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        anim1b.setRepeatCount(ValueAnimator.INFINITE);
1709420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        anim1b.setRepeatMode(ValueAnimator.REVERSE);
1719420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        anim1b.setDuration(1000);
1729420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        anim1b.start();
1739420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    }
1749420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1759420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    public static class MyLayout extends LinearLayout {
1769420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1779420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        public MyLayout(Context context) {
1789420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            super(context);
1799420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            setStaticTransformationsEnabled(true);
1809420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        }
1819420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1829420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        public MyLayout(Context context, AttributeSet attrs) {
1839420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            super(context, attrs);
1849420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            setStaticTransformationsEnabled(true);
1859420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        }
1869420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1879420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        public MyLayout(Context context, AttributeSet attrs, int defStyle) {
1889420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            super(context, attrs, defStyle);
1899420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            setStaticTransformationsEnabled(true);
1909420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        }
1919420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1929420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        @Override
1939420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        protected boolean getChildStaticTransformation(View child, Transformation t) {
1949420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            t.clear();
1959420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            t.setAlpha(.35f);
1969420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1979420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            return true;
1989420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        }
1999420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    }
2009420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase}
2019420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
202