add test app for ninepatch drawing
This commit is contained in:
210
apps/NinePatchLab/src/com/android/ninepatch/NinePatchLab.java
Normal file
210
apps/NinePatchLab/src/com/android/ninepatch/NinePatchLab.java
Normal file
@@ -0,0 +1,210 @@
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user