| /* | |
| * Copyright (C) 2015 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except | |
| * in compliance with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software distributed under the License | |
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express | |
| * or implied. See the License for the specific language governing permissions and limitations under | |
| * the License. | |
| */ | |
| package android.windowanimationjank; | |
| import java.util.Random; | |
| import android.app.Activity; | |
| import android.os.Bundle; | |
| import android.view.ViewTreeObserver.OnPreDrawListener; | |
| import android.widget.Chronometer; | |
| import android.widget.RadioButton; | |
| import android.widget.Switch; | |
| import android.widget.TextView; | |
| import android.widget.ToggleButton; | |
| /* | |
| * Activity with arbitrary number of random UI elements, refresh itself constantly. | |
| */ | |
| public class ElementLayoutActivity extends Activity implements OnPreDrawListener { | |
| public final static String NUM_ELEMENTS_KEY = "num_elements"; | |
| private final static int DEFAULT_NUM_ELEMENTS = 100; | |
| private final static int BACKGROUND_COLOR = 0xfffff000; | |
| private final static int INDICATOR_COLOR = 0xffff0000; | |
| private FlowLayout mLayout; | |
| // Use the constant seed in order to get predefined order of elements. | |
| private Random mRandom = new Random(0); | |
| // Blinker indicator for visual feedback that Activity is currently updating. | |
| private TextView mIndicator; | |
| private static float mIndicatorState; | |
| @Override | |
| protected void onCreate(final Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| setContentView(R.layout.flowlayout); | |
| mLayout = (FlowLayout)findViewById(R.id.root_flow_layout); | |
| mLayout.setBackgroundColor(BACKGROUND_COLOR); | |
| mIndicator = new TextView(this); | |
| mLayout.addView(mIndicator); | |
| mIndicator.setText("***\n***"); | |
| mIndicator.setBackgroundColor(BACKGROUND_COLOR); | |
| mIndicatorState = 0.0f; | |
| // Need constantly invalidate view in order to get max redraw rate. | |
| mLayout.getViewTreeObserver().addOnPreDrawListener(this); | |
| // Read requested number of elements in layout. | |
| int numElements = getIntent().getIntExtra(NUM_ELEMENTS_KEY, DEFAULT_NUM_ELEMENTS); | |
| for (int i = 0; i < numElements; ++i) { | |
| switch (mRandom.nextInt(5)) { | |
| case 0: | |
| createRadioButton(); | |
| break; | |
| case 1: | |
| createToggleButton(); | |
| break; | |
| case 2: | |
| createSwitch(); | |
| break; | |
| case 3: | |
| createTextView(); | |
| break; | |
| case 4: | |
| createChronometer(); | |
| break; | |
| } | |
| } | |
| setContentView(mLayout); | |
| } | |
| private void createTextView() { | |
| TextView textView = new TextView(this); | |
| int lineCnt = mRandom.nextInt(4); | |
| StringBuffer buffer = new StringBuffer(); | |
| for (int i = 0; i < lineCnt; ++i) { | |
| if (i != 0) { | |
| buffer.append("\n"); | |
| } | |
| buffer.append("Line:" + mRandom.nextInt()); | |
| } | |
| textView.setText(buffer); | |
| mLayout.addView(textView); | |
| } | |
| private void createRadioButton() { | |
| RadioButton button = new RadioButton(this); | |
| button.setText("RadioButton:" + mRandom.nextInt()); | |
| mLayout.addView(button); | |
| } | |
| private void createToggleButton() { | |
| ToggleButton button = new ToggleButton(this); | |
| button.setChecked(mRandom.nextBoolean()); | |
| mLayout.addView(button); | |
| } | |
| private void createSwitch() { | |
| Switch button = new Switch(this); | |
| button.setChecked(mRandom.nextBoolean()); | |
| mLayout.addView(button); | |
| } | |
| private void createChronometer() { | |
| Chronometer chronometer = new Chronometer(this); | |
| chronometer.setBase(mRandom.nextLong()); | |
| mLayout.addView(chronometer); | |
| chronometer.start(); | |
| } | |
| @Override | |
| protected void onResume() { | |
| super.onResume(); | |
| } | |
| @Override | |
| protected void onPause() { | |
| super.onPause(); | |
| } | |
| @Override | |
| public boolean onPreDraw() { | |
| // Interpolate indicator color | |
| int background = 0xff000000; | |
| for (int i = 0; i < 3; ++i) { | |
| int shift = 8 * i; | |
| int colorB = (BACKGROUND_COLOR >> shift) & 0xff; | |
| int colorI = (INDICATOR_COLOR >> shift) & 0xff; | |
| int color = (int)((float)colorB * (1.0f - mIndicatorState) + | |
| (float)colorI * mIndicatorState); | |
| if (color > 255) { | |
| color = 255; | |
| } | |
| background |= (color << shift); | |
| } | |
| mIndicator.setBackgroundColor(background); | |
| mIndicatorState += (3 / 60.0f); // around 3 times per second | |
| mIndicatorState = mIndicatorState - (int)mIndicatorState; | |
| mLayout.postInvalidate(); | |
| return true; | |
| } | |
| } |