package com.zzx.factorytest.view; import com.zzx.factorytest.R; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.Log; import android.view.View; public class PowerView extends View { private int mGridHeight = 0; private boolean DEBUG = true; private final String MIC_DEBUG = "micdebug"; private final int HISTORY_POWER_COUNT = 32; private final int GRID_COUNT = 10; private double currentPower = 0; private double prePower = 0; private double mAveragePower = 0; private double[] historyPowers = new double[HISTORY_POWER_COUNT]; private int historyIndex = 0; private int mViewHeight = 0; private int mViewWidth = 0; private int mGridMarginVer = 0; private int mGridMarginHor = 0; private int mGridStartX = 0; private int mGridStartY = 0; private int baseValue = -100; private int baseAddvalue = 10; private int valueCount = 10; private int mGridSpace = 0; private int textHeight = 0; private int textBaseLingY = 0; private float mTextStrokeWidth = 0; private float mTextSize = 0; private float mTextScaleX = 0; private Paint paint = new Paint(); private Rect rect = new Rect(); private Resources mRes = null; public PowerView(Context context, int _viewHeight, int _viewWidth) { super(context); mRes = context.getResources(); // this.setBackgroundColor(Color.BLUE); mViewHeight = _viewHeight; mViewWidth = _viewWidth; mGridMarginVer = Integer.valueOf(mRes.getString(R.string.power_view_mGridMarginVer)); mTextStrokeWidth = Float.valueOf(mRes .getString(R.string.power_view_paint_stroke_width)); mTextSize = Float.valueOf(mRes.getString(R.string.power_view_paint_text_size)); mTextScaleX = Float.valueOf(mRes.getString(R.string.power_view_paint_text_scalex)); paint.setStrokeWidth(mTextStrokeWidth); paint.setTextSize(mTextSize); paint.setTextScaleX(mTextScaleX); paint.getTextBounds(String.valueOf(baseValue), 0, String.valueOf(baseValue).length(), rect); mGridMarginHor = rect.width() / 2; textHeight = rect.height(); mGridSpace = (mViewWidth - mGridMarginHor * 2) / valueCount; mGridHeight = Integer.valueOf(context.getResources().getString(R.string.power_view_grid_height)); Log.d(MIC_DEBUG, "mViewHeight = " + mViewHeight + " ; mViewWidth = " + mViewWidth + " ; mGridMarginHor = " + mGridMarginHor + " ; mGridSpace = " + mGridSpace); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawGridAndText(canvas); drawPower(canvas); drawDbAndPeak(canvas); } private void drawPower(Canvas canvas) { drawCurrentPower(canvas); drawHigestPower(canvas); } private void drawHigestPower(Canvas canvas) { } private void drawCurrentPower(Canvas canvas) { paint.setColor(Color.BLUE); paint.setAntiAlias(true); paint.setStrokeWidth(20.f); float progressScale = (float) (Math.abs(currentPower) / 100.0); float progressWidth = mGridSpace * valueCount * (1 - progressScale); int startY = mGridMarginVer + mGridHeight / 2; canvas.drawLine(mGridStartX, startY, mGridStartX + progressWidth, startY, paint); } private void drawGridAndText(Canvas canvas) { drawGrid(canvas); drawText(canvas); } private void drawText(Canvas canvas) { paint.setColor(Color.YELLOW); paint.setAntiAlias(true); paint.setStrokeWidth(mTextStrokeWidth); paint.setTextSize(mTextSize); paint.setTextScaleX(mTextScaleX); int startX = 0; textBaseLingY = mGridMarginVer + mGridHeight + textHeight + 5; for (int i = baseValue; i <= 0; i += 10) { canvas.drawText(String.valueOf(i), startX, textBaseLingY, paint); // Log.d(MIC_DEBUG, i + ""); if (-10 == i) { startX += mGridSpace * 1.5; } else startX += mGridSpace; } } private void drawDbAndPeak(Canvas canvas) { String currentDb = currentPower + ""; paint.setStrokeWidth(Float.valueOf(mRes.getString(R.string.power_view_paint_db_stroke_width))); paint.setTextSize(Float.valueOf(mRes.getString(R.string.power_view_paint_db_text_size))); paint.setColor(Color.BLUE); paint.setTextScaleX(Float.valueOf(mRes.getString(R.string.power_view_paint_db_text_scalex))); paint.setAntiAlias(true); paint.getTextBounds(currentDb, 0, currentDb.length(), rect); if (currentDb.length() >= 6) currentDb = currentDb.substring(0, 6); int marginTop = Integer.valueOf(mRes.getString(R.string.db_text_margin_top)); canvas.drawText(currentDb + " dB", 10, textBaseLingY + rect.height() + marginTop, paint); } private void drawGrid(Canvas canvas) { mGridStartY = mGridMarginVer; mGridStartX = mGridMarginHor; paint.setColor(Color.YELLOW); paint.setAntiAlias(true); paint.setStrokeWidth(1.0f); for (int i = 0; i <= valueCount; i++) { canvas.drawLine(mGridStartX, mGridStartY, mGridStartX, mGridStartY + mGridHeight, paint); mGridStartX += mGridSpace; } mGridStartX = mGridMarginHor; for (int i = 0; i <= 1; i++) { canvas.drawLine(mGridStartX, mGridStartY, mGridStartX + valueCount * mGridSpace, mGridStartY, paint); mGridStartY += mGridHeight; } } public void update(double _currentPower) { if (_currentPower < -100.0) _currentPower = -100.0; else if (_currentPower > 0.0) _currentPower = 0.0; currentPower = (float) _currentPower; // Log.d(MainActivity.TAG_D, "PowerView.currentPower --------> " + currentPower); // Get the previous power value, and add the new value into the // history buffer. Re-calculate the rolling average power value. if (++historyIndex >= historyPowers.length) historyIndex = 0; prePower = historyPowers[historyIndex]; historyPowers[historyIndex] = (float) _currentPower; mAveragePower -= prePower / HISTORY_POWER_COUNT; mAveragePower += (float) _currentPower / HISTORY_POWER_COUNT; /*if (DEBUG) { Log.d(MIC_DEBUG, "CurrentPower ---> " + currentPower + "mAveragePower ---> " + mAveragePower); }*/ this.invalidate(); } }