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