Fix b/242009481: Refine the battery usage chart timestamp label rule
Draw the first and the last labels. Then recursively draws axis labels between the start index and the end index. If the inner number can be exactly divided into 2 parts, check and draw the middle index label and then recursively draw the 2 parts. Otherwise, divide into 3 parts. Check and draw the middle two labels and then recursively draw the 3 parts. If there are any overlaps, skip drawing and go back to the uplevel of the recursion. screenshots: https://drive.google.com/drive/folders/11AJ4Fz6xS76LGlbAy9WfvjZpffgFkMji?resourcekey=0-HBWCQa1oQW4e0UfvLzEXGQ&usp=sharing Bug: 242009481 Fix: 242009481 Test: manual Change-Id: Iaa9019feba7693638d5ae64bbbee7298eb74f749
This commit is contained in:
@@ -462,53 +462,60 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Pairly draws axis labels from left and right side to middle. If the pair of labels have
|
|
||||||
* any overlap, skips that pair of labels.
|
|
||||||
*/
|
|
||||||
private void drawAxisLabels(Canvas canvas, final Rect[] displayAreas, final float baselineY) {
|
private void drawAxisLabels(Canvas canvas, final Rect[] displayAreas, final float baselineY) {
|
||||||
int forwardCheckLine = Integer.MIN_VALUE;
|
final int lastIndex = displayAreas.length - 1;
|
||||||
int backwardCheckLine = Integer.MAX_VALUE;
|
// Suppose first and last labels are always able to draw.
|
||||||
Rect middleDisplayArea = null;
|
drawAxisLabelText(canvas, 0, displayAreas[0], baselineY);
|
||||||
for (int forwardIndex = 0, backwordIndex = displayAreas.length - 1;
|
drawAxisLabelText(canvas, lastIndex, displayAreas[lastIndex], baselineY);
|
||||||
forwardIndex <= backwordIndex; forwardIndex++, backwordIndex--) {
|
drawAxisLabelsBetweenStartIndexAndEndIndex(canvas, displayAreas, 0, lastIndex, baselineY);
|
||||||
final Rect forwardDisplayArea = displayAreas[forwardIndex];
|
}
|
||||||
final Rect backwardDisplayArea = displayAreas[backwordIndex];
|
|
||||||
if (forwardDisplayArea.left < forwardCheckLine
|
|
||||||
|| backwardDisplayArea.right > backwardCheckLine) {
|
|
||||||
// Overlapped at left or right, skip the pair of labels
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (middleDisplayArea != null && (
|
|
||||||
forwardDisplayArea.right + mTextPadding > middleDisplayArea.left
|
|
||||||
|| backwardDisplayArea.left - mTextPadding < middleDisplayArea.right)) {
|
|
||||||
// Overlapped with the middle label.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (forwardIndex != backwordIndex
|
|
||||||
&& forwardDisplayArea.right + mTextPadding > backwardDisplayArea.left) {
|
|
||||||
// Overlapped in the middle, skip the pair of labels
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
drawAxisLabelText(canvas, forwardIndex, forwardDisplayArea, baselineY);
|
/**
|
||||||
drawAxisLabelText(canvas, backwordIndex, backwardDisplayArea, baselineY);
|
* Recursively draws axis labels between the start index and the end index. If the inner number
|
||||||
|
* can be exactly divided into 2 parts, check and draw the middle index label and then
|
||||||
forwardCheckLine = forwardDisplayArea.right + mTextPadding;
|
* recursively draw the 2 parts. Otherwise, divide into 3 parts. Check and draw the middle two
|
||||||
backwardCheckLine = backwardDisplayArea.left - mTextPadding;
|
* labels and then recursively draw the 3 parts. If there are any overlaps, skip drawing and go
|
||||||
|
* back to the uplevel of the recursion.
|
||||||
// If the number of labels is odd, draw the middle label first
|
*/
|
||||||
if (forwardIndex == 0 && backwordIndex % 2 == 0) {
|
private void drawAxisLabelsBetweenStartIndexAndEndIndex(Canvas canvas,
|
||||||
final int middleIndex = backwordIndex / 2;
|
final Rect[] displayAreas, final int startIndex, final int endIndex,
|
||||||
middleDisplayArea = displayAreas[middleIndex];
|
final float baselineY) {
|
||||||
if (middleDisplayArea.left < forwardCheckLine
|
if (endIndex - startIndex <= 1) {
|
||||||
|| middleDisplayArea.right > backwardCheckLine) {
|
return;
|
||||||
// Overlapped at left or right, skip the pair of labels
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
drawAxisLabelText(canvas, middleIndex, middleDisplayArea, baselineY);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if ((endIndex - startIndex) % 2 == 0) {
|
||||||
|
int middleIndex = (startIndex + endIndex) / 2;
|
||||||
|
if (hasOverlap(displayAreas, startIndex, middleIndex)
|
||||||
|
|| hasOverlap(displayAreas, middleIndex, endIndex)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
drawAxisLabelText(canvas, middleIndex, displayAreas[middleIndex], baselineY);
|
||||||
|
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
||||||
|
canvas, displayAreas, startIndex, middleIndex, baselineY);
|
||||||
|
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
||||||
|
canvas, displayAreas, middleIndex, endIndex, baselineY);
|
||||||
|
} else {
|
||||||
|
int middleIndex1 = startIndex + round((endIndex - startIndex) / 3f);
|
||||||
|
int middleIndex2 = startIndex + round((endIndex - startIndex) * 2 / 3f);
|
||||||
|
if (hasOverlap(displayAreas, startIndex, middleIndex1)
|
||||||
|
|| hasOverlap(displayAreas, middleIndex1, middleIndex2)
|
||||||
|
|| hasOverlap(displayAreas, middleIndex2, endIndex)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
drawAxisLabelText(canvas, middleIndex1, displayAreas[middleIndex1], baselineY);
|
||||||
|
drawAxisLabelText(canvas, middleIndex2, displayAreas[middleIndex2], baselineY);
|
||||||
|
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
||||||
|
canvas, displayAreas, startIndex, middleIndex1, baselineY);
|
||||||
|
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
||||||
|
canvas, displayAreas, middleIndex1, middleIndex2, baselineY);
|
||||||
|
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
||||||
|
canvas, displayAreas, middleIndex2, endIndex, baselineY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasOverlap(
|
||||||
|
final Rect[] displayAreas, final int leftIndex, final int rightIndex) {
|
||||||
|
return displayAreas[leftIndex].right + mTextPadding * 2f > displayAreas[rightIndex].left;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawAxisLabelText(
|
private void drawAxisLabelText(
|
||||||
|
Reference in New Issue
Block a user