| /* |
| * 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; |
| } |
| } |