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