/** * */ package com.android.settings.applications; import android.content.Context; import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; import android.graphics.Shader; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.widget.LinearLayout; public class LinearColorBar extends LinearLayout { static final int LEFT_COLOR = 0xff0099cc; static final int MIDDLE_COLOR = 0xff0099cc; static final int RIGHT_COLOR = 0xff888888; private float mRedRatio; private float mYellowRatio; private float mGreenRatio; private boolean mShowingGreen; final Rect mRect = new Rect(); final Paint mPaint = new Paint(); int mLastInterestingLeft, mLastInterestingRight; int mLineWidth; final Path mColorPath = new Path(); final Path mEdgePath = new Path(); final Paint mColorGradientPaint = new Paint(); final Paint mEdgeGradientPaint = new Paint(); public LinearColorBar(Context context, AttributeSet attrs) { super(context, attrs); setWillNotDraw(false); mPaint.setStyle(Paint.Style.FILL); mColorGradientPaint.setStyle(Paint.Style.FILL); mColorGradientPaint.setAntiAlias(true); mEdgeGradientPaint.setStyle(Paint.Style.STROKE); mLineWidth = getResources().getDisplayMetrics().densityDpi >= DisplayMetrics.DENSITY_HIGH ? 2 : 1; mEdgeGradientPaint.setStrokeWidth(mLineWidth); mEdgeGradientPaint.setAntiAlias(true); } public void setRatios(float red, float yellow, float green) { mRedRatio = red; mYellowRatio = yellow; mGreenRatio = green; invalidate(); } public void setShowingGreen(boolean showingGreen) { if (mShowingGreen != showingGreen) { mShowingGreen = showingGreen; updateIndicator(); invalidate(); } } private void updateIndicator() { int off = getPaddingTop() - getPaddingBottom(); if (off < 0) off = 0; mRect.top = off; mRect.bottom = getHeight(); if (mShowingGreen) { mColorGradientPaint.setShader(new LinearGradient( 0, 0, 0, off-2, RIGHT_COLOR&0xffffff, RIGHT_COLOR, Shader.TileMode.CLAMP)); } else { mColorGradientPaint.setShader(new LinearGradient( 0, 0, 0, off-2, MIDDLE_COLOR&0xffffff, MIDDLE_COLOR, Shader.TileMode.CLAMP)); } mEdgeGradientPaint.setShader(new LinearGradient( 0, 0, 0, off/2, 0x00a0a0a0, 0xffa0a0a0, Shader.TileMode.CLAMP)); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); updateIndicator(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = getWidth(); int left = 0; int right = left + (int)(width*mRedRatio); int right2 = right + (int)(width*mYellowRatio); int right3 = right2 + (int)(width*mGreenRatio); int indicatorLeft, indicatorRight; if (mShowingGreen) { indicatorLeft = right2; indicatorRight = right3; } else { indicatorLeft = right; indicatorRight = right2; } if (mLastInterestingLeft != indicatorLeft || mLastInterestingRight != indicatorRight) { mColorPath.reset(); mEdgePath.reset(); if (indicatorLeft < indicatorRight) { final int midTopY = mRect.top; final int midBottomY = 0; final int xoff = 2; mColorPath.moveTo(indicatorLeft, mRect.top); mColorPath.cubicTo(indicatorLeft, midBottomY, -xoff, midTopY, -xoff, 0); mColorPath.lineTo(width+xoff-1, 0); mColorPath.cubicTo(width+xoff-1, midTopY, indicatorRight, midBottomY, indicatorRight, mRect.top); mColorPath.close(); final float lineOffset = mLineWidth+.5f; mEdgePath.moveTo(-xoff+lineOffset, 0); mEdgePath.cubicTo(-xoff+lineOffset, midTopY, indicatorLeft+lineOffset, midBottomY, indicatorLeft+lineOffset, mRect.top); mEdgePath.moveTo(width+xoff-1-lineOffset, 0); mEdgePath.cubicTo(width+xoff-1-lineOffset, midTopY, indicatorRight-lineOffset, midBottomY, indicatorRight-lineOffset, mRect.top); } mLastInterestingLeft = indicatorLeft; mLastInterestingRight = indicatorRight; } if (!mEdgePath.isEmpty()) { canvas.drawPath(mEdgePath, mEdgeGradientPaint); canvas.drawPath(mColorPath, mColorGradientPaint); } if (left < right) { mRect.left = left; mRect.right = right; mPaint.setColor(LEFT_COLOR); canvas.drawRect(mRect, mPaint); width -= (right-left); left = right; } right = right2; if (left < right) { mRect.left = left; mRect.right = right; mPaint.setColor(MIDDLE_COLOR); canvas.drawRect(mRect, mPaint); width -= (right-left); left = right; } right = left + width; if (left < right) { mRect.left = left; mRect.right = right; mPaint.setColor(RIGHT_COLOR); canvas.drawRect(mRect, mPaint); } } }