/******************************************************************************* * Copyright 2013-2014 alladin-IT GmbH * * 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 at.alladin.rmbt.android.test; import java.text.Format; import java.text.NumberFormat; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.graphics.drawable.Drawable; import android.util.Log; public class Gauge extends Drawable { /* * init: 14 1 ping: 14 1 down: 33 1 up: 32 */ final static String LOG = "Gauge"; final Bitmap background; final Bitmap foreground; final Bitmap dynamic; final Bitmap drawBitmap; final Canvas drawCanvas; final Paint paint = new Paint(); final Paint erasePaint; final RectF ovalRect; final float startAngle; final float maxAngle; final Format formatter = NumberFormat.getPercentInstance(); final int width; final int height; Rect bounds; double value = 0; public Gauge(final float startAngle, final float maxAngle, final Bitmap background, final Bitmap dynamic, final Bitmap foreground, final float x1, final float y1, final float x2, final float y2) { this.startAngle = startAngle; this.maxAngle = maxAngle; this.background = background; this.dynamic = dynamic; this.foreground = foreground; width = background.getWidth(); height = background.getHeight(); drawBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); drawCanvas = new Canvas(drawBitmap); paint.setFilterBitmap(true); Log.d(LOG, "density background: " + background.getDensity()); erasePaint = new Paint(); erasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); erasePaint.setAntiAlias(true); // erasePaint.setAlpha(0); ovalRect = new RectF(width * x1, height * y1, width * x2, height * y2); } public void setValue(double value) { if (value < 0) value = 0; else if (value > 1) value = 1; this.value = value; invalidateSelf(); } @Override public void draw(final Canvas canvas) { final Rect r = getBounds(); final int saveCount = canvas.save(); canvas.clipRect(r, Region.Op.REPLACE); canvas.translate(r.left, r.top); canvas.drawBitmap(background, 0, 0, paint); drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); drawCanvas.drawBitmap(dynamic, 0, 0, null); final float angle; if (maxAngle >= 0) angle = -(float) (360d - (maxAngle * value)); else angle = (float) (360d - (-maxAngle * value)); drawCanvas.drawArc(ovalRect, startAngle, angle, true, erasePaint); canvas.drawBitmap(drawBitmap, 0, 0, paint); canvas.drawBitmap(foreground, 0, 0, paint); // canvas.drawText(formatter.format(value), textX, textY, textPaint); canvas.restoreToCount(saveCount); } @Override public int getMinimumHeight() { return height; } @Override public int getMinimumWidth() { return width; } @Override public int getIntrinsicHeight() { return height; } @Override public int getIntrinsicWidth() { return width; } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public void setAlpha(final int alpha) { paint.setAlpha(alpha); // textPaint.setAlpha(alpha); invalidateSelf(); } @Override public void setColorFilter(final ColorFilter cf) { paint.setColorFilter(cf); // textPaint.setColorFilter(cf); invalidateSelf(); } public void recycle() { background.recycle(); foreground.recycle(); dynamic.recycle(); drawBitmap.recycle(); } }