<LinearLayout
android:id="@+id/graph_label_group"
android:layout_width="match_parent"
- android:layout_height="@dimen/usage_graph_area_height"
+ android:layout_height="0dp"
+ android:layout_weight="1"
android:orientation="horizontal"
android:clipChildren="false"
android:clipToPadding="false">
layout="@layout/usage_side_label" />
<Space
+ android:id="@+id/space1"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" />
layout="@layout/usage_side_label" />
<Space
+ android:id="@+id/space2"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" />
private final Paint mDottedPaint;
private final Drawable mDivider;
+ private final Drawable mTintedDivider;
private final int mDividerSize;
private final Path mPath = new Path();
private final SparseIntArray mPaths = new SparseIntArray();
// Paths in local coordinates for drawing.
private final SparseIntArray mLocalPaths = new SparseIntArray();
+ private final int mCornerRadius;
private int mAccentColor;
private boolean mShowProjection;
private float mMaxX = 100;
private float mMaxY = 100;
+ private float mMiddleDividerLoc = .5f;
+ private int mMiddleDividerTint = -1;
+ private int mTopDividerTint = -1;
+
public UsageGraph(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
final Resources resources = context.getResources();
mLinePaint.setStrokeCap(Cap.ROUND);
mLinePaint.setStrokeJoin(Join.ROUND);
mLinePaint.setAntiAlias(true);
- mLinePaint.setPathEffect(new CornerPathEffect(resources.getDimensionPixelSize(
- R.dimen.usage_graph_line_corner_radius)));
+ mCornerRadius = resources.getDimensionPixelSize(R.dimen.usage_graph_line_corner_radius);
+ mLinePaint.setPathEffect(new CornerPathEffect(mCornerRadius));
mLinePaint.setStrokeWidth(resources.getDimensionPixelSize(R.dimen.usage_graph_line_width));
mFillPaint = new Paint(mLinePaint);
TypedValue v = new TypedValue();
context.getTheme().resolveAttribute(com.android.internal.R.attr.listDivider, v, true);
mDivider = context.getDrawable(v.resourceId);
+ mTintedDivider = context.getDrawable(v.resourceId);
mDividerSize = resources.getDimensionPixelSize(R.dimen.usage_graph_divider_size);
}
mMaxY = maxY;
}
+ void setDividerLoc(int height) {
+ mMiddleDividerLoc = 1 - height / mMaxY;
+ }
+
+ void setDividerColors(int middleColor, int topColor) {
+ mMiddleDividerTint = middleColor;
+ mTopDividerTint = topColor;
+ }
+
public void addPath(SparseIntArray points) {
for (int i = 0; i < points.size(); i++) {
mPaths.put(points.keyAt(i), points.valueAt(i));
if (mLocalPaths.size() > 0) {
int lastX = mLocalPaths.keyAt(mLocalPaths.size() - 1);
int lastY = mLocalPaths.valueAt(mLocalPaths.size() - 1);
- if (lastY != PATH_DELIM && (lastX == lx || lastY == ly)) {
+ if (lastY != PATH_DELIM && !hasDiff(lastX, lx) && !hasDiff(lastY, ly)) {
pendingYLoc = ly;
continue;
}
}
}
+ private boolean hasDiff(int x1, int x2) {
+ return Math.abs(x2 - x1) >= mCornerRadius;
+ }
+
private int getX(float x) {
return (int) (x / mMaxX * getWidth());
}
@Override
protected void onDraw(Canvas canvas) {
// Draw lines across the top, middle, and bottom.
- drawDivider(0, canvas);
- drawDivider((canvas.getHeight() - mDividerSize) / 2, canvas);
- drawDivider(canvas.getHeight() - mDividerSize, canvas);
+ if (mMiddleDividerLoc != 0) {
+ drawDivider(0, canvas, mTopDividerTint);
+ }
+ drawDivider((int) ((canvas.getHeight() - mDividerSize) * mMiddleDividerLoc), canvas,
+ mMiddleDividerTint);
+ drawDivider(canvas.getHeight() - mDividerSize, canvas, -1);
if (mLocalPaths.size() == 0) {
return;
canvas.drawPath(mPath, mFillPaint);
}
- private void drawDivider(int y, Canvas canvas) {
- mDivider.setBounds(0, y, canvas.getWidth(), y + mDividerSize);
- mDivider.draw(canvas);
+ private void drawDivider(int y, Canvas canvas, int tintColor) {
+ Drawable d = mDivider;
+ if (tintColor != -1) {
+ mTintedDivider.setTint(tintColor);
+ d = mTintedDivider;
+ }
+ d.setBounds(0, y, canvas.getWidth(), y + mDividerSize);
+ d.draw(canvas);
}
}
import android.util.SparseIntArray;
import android.view.Gravity;
import android.view.LayoutInflater;
+import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
mUsageGraph.setAccentColor(color);
}
+ public void setDividerLoc(int dividerLoc) {
+ mUsageGraph.setDividerLoc(dividerLoc);
+ }
+
+ public void setDividerColors(int middleColor, int topColor) {
+ mUsageGraph.setDividerColors(middleColor, topColor);
+ }
+
+ public void setSideLabelWeights(float before, float after) {
+ setWeight(R.id.space1, before);
+ setWeight(R.id.space2, after);
+ }
+
+ private void setWeight(int id, float weight) {
+ View v = findViewById(id);
+ LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams();
+ params.weight = weight;
+ v.setLayoutParams(params);
+ }
+
public void setSideLabels(CharSequence[] labels) {
if (labels.length != mLabels.length) {
throw new IllegalArgumentException("Invalid number of labels");