blob: bcb61a7b4b6819cd0bfd3da61c4d0d02bc808052 [file] [log] [blame]
/*
* Copyright (C) 2009 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 com.android.ninepatchlab;
import com.android.ninepatchlab.R;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.*;
import android.graphics.drawable.*;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.KeyEvent;
import android.view.*;
public class NinePatchLab extends Activity {
public NinePatchLab() {}
Drawable[] mButtons;
Drawable[] mBGs;
float mScale;
boolean mShowFPS = true;
boolean mDoDither = true;
boolean mDoFilter = true;
int mCurrBGIndex;
private static final int FPS_COUNTER_LIMIT = 30;
private int mFPSTime;
private int mFPSCounter;
private int mFPSAve;
private View mView;
private void updateTitle() {
String title = "D=" + mDoDither + " F=" + mDoFilter;
if (mShowFPS) {
title += " FPS=" + mFPSAve;
}
setTitle(title);
}
private static Drawable make_custom_bg() {
int[] colors = new int[] {
// 0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 0xFFFFFF00, 0xFFFF0000
0xFFFF0000, 0xFF0000FF
};
return new GradientDrawable(GradientDrawable.Orientation.TR_BL,
colors);
}
private static Drawable make_solid_bg() {
return new ColorDrawable(0xFF008800);
}
private class NPView extends View {
public NPView(Context context) {
super(context);
setFocusable(true);
int[] bgs = new int[] {
R.drawable.bg_grad_blue,
R.drawable.bg_grad_green,
R.drawable.bg_grad_grey,
R.drawable.bg_grad_red,
R.drawable.bg_grad_yellow,
};
int[] ids = new int[] {
R.drawable.btn_dark_ticks_stretch_multiple,
R.drawable.btn_dark_ticks_stretch_single,
R.drawable.btn_transparent_ticks_stretch_multiple,
R.drawable.btn_transparent_ticks_stretch_single,
R.drawable.btn_light_ticks_stretch_multiple,
R.drawable.btn_light_ticks_stretch_single,
};
mButtons = new Drawable[ids.length];
mBGs = new Drawable[bgs.length + 2];
Resources res = context.getResources();
for (int i = 0; i < ids.length; i++) {
mButtons[i] = res.getDrawable(ids[i]);
}
for (int i = 0; i < bgs.length; i++) {
mBGs[i] = res.getDrawable(bgs[i]);
}
mBGs[bgs.length] = make_custom_bg();
mBGs[bgs.length+1] = make_solid_bg();
mScale = res.getDisplayMetrics().density;
}
private static final int MARGIN_X = 16;
private static final int MARGIN_Y = 8;
private void setDrawableFlags(Drawable dr) {
dr.setDither(mDoDither);
dr.setFilterBitmap(mDoFilter);
}
protected void onDraw(Canvas canvas) {
long now = 0;
if (mShowFPS) {
now = SystemClock.uptimeMillis();
}
Drawable bg = mBGs[mCurrBGIndex];
bg.setBounds(0, 0, getWidth(), getHeight());
setDrawableFlags(bg);
bg.draw(canvas);
final int WIDTH = getWidth() - 2*MARGIN_X;
final int HEIGHT = getHeight() - 2*MARGIN_Y;
final int N = mButtons.length;
final int gapSize = Math.round(mScale * 8);
final int drHeight = (HEIGHT - (N - 1) * gapSize) / N;
final int drWidth = WIDTH;
// canvas.drawColor(0xFF5F810C);
canvas.translate(MARGIN_X, MARGIN_Y);
for (Drawable dr : mButtons) {
dr.setBounds(0, 0, drWidth, drHeight);
setDrawableFlags(dr);
dr.draw(canvas);
canvas.translate(0, drHeight + gapSize);
}
if (mShowFPS) {
mFPSTime += (int)(SystemClock.uptimeMillis() - now);
mFPSCounter += 1;
if (mFPSCounter > FPS_COUNTER_LIMIT) {
mFPSAve = mFPSCounter * 1000 / mFPSTime;
updateTitle();
mFPSTime = 0;
mFPSCounter = 0;
}
invalidate();
}
}
}
private void toggleFPS() {
mShowFPS = !mShowFPS;
if (mShowFPS) {
mFPSCounter = 0;
mFPSTime = 0;
mView.invalidate();
}
}
@Override public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_DOWN:
mDoFilter = !mDoFilter;
updateTitle();
mView.invalidate();
return true;
case KeyEvent.KEYCODE_DPAD_UP:
mDoDither = !mDoDither;
updateTitle();
mView.invalidate();
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
mCurrBGIndex = (mCurrBGIndex + 1) % mBGs.length;
mView.invalidate();
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
mCurrBGIndex -= 1;
if (mCurrBGIndex < 0) {
mCurrBGIndex = 0;
}
mView.invalidate();
return true;
case KeyEvent.KEYCODE_VOLUME_UP:
toggleFPS();
return true;
case KeyEvent.KEYCODE_U:
case KeyEvent.KEYCODE_D:
case KeyEvent.KEYCODE_VOLUME_DOWN:
return super.onKeyDown(keyCode, event);
}
return super.onKeyDown(keyCode, event);
}
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
mView = new NPView(this);
setContentView(mView);
}
}