Merge "Make sure view is laid out before calling createBitmap" am: 13b8faaaa1 am: d33d089b71

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2216261

Change-Id: I46dfeca84109f740810e10fdea22c5f5913d3845
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Treehugger Robot
2022-11-03 03:12:57 +00:00
committed by Automerger Merge Worker

View File

@@ -34,16 +34,16 @@ public class QrDecorateView extends View {
private static final float CORNER_LINE_LENGTH = 264f; // 264dp private static final float CORNER_LINE_LENGTH = 264f; // 264dp
private static final float CORNER_RADIUS = 16f; // 16dp private static final float CORNER_RADIUS = 16f; // 16dp
final private int mCornerColor; private final int mCornerColor;
final private int mFocusedCornerColor; private final int mFocusedCornerColor;
final private int mBackgroundColor; private final int mBackgroundColor;
final private Paint mStrokePaint; private final Paint mStrokePaint;
final private Paint mTransparentPaint; private final Paint mTransparentPaint;
final private Paint mBackgroundPaint; private final Paint mBackgroundPaint;
final private float mRadius; private final float mRadius;
final private float mInnerRidus; private final float mInnerRadius;
private Bitmap mMaskBitmap; private Bitmap mMaskBitmap;
private Canvas mMaskCanvas; private Canvas mMaskCanvas;
@@ -72,7 +72,7 @@ public class QrDecorateView extends View {
mRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, mRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS,
getResources().getDisplayMetrics()); getResources().getDisplayMetrics());
// Inner radius needs to minus stroke width for keeping the width of border consistent. // Inner radius needs to minus stroke width for keeping the width of border consistent.
mInnerRidus = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mInnerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
CORNER_RADIUS - CORNER_STROKE_WIDTH, getResources().getDisplayMetrics()); CORNER_RADIUS - CORNER_STROKE_WIDTH, getResources().getDisplayMetrics());
mCornerColor = context.getResources().getColor(R.color.qr_corner_line_color); mCornerColor = context.getResources().getColor(R.color.qr_corner_line_color);
@@ -95,6 +95,9 @@ public class QrDecorateView extends View {
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom); super.onLayout(changed, left, top, right, bottom);
if (!isLaidOut()) {
return;
}
if (mMaskBitmap == null) { if (mMaskBitmap == null) {
mMaskBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); mMaskBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
mMaskCanvas = new Canvas(mMaskBitmap); mMaskCanvas = new Canvas(mMaskBitmap);
@@ -105,6 +108,7 @@ public class QrDecorateView extends View {
@Override @Override
protected void onDraw(Canvas canvas) { protected void onDraw(Canvas canvas) {
if (mMaskCanvas != null && mMaskBitmap != null) {
// Set frame line color. // Set frame line color.
mStrokePaint.setColor(mFocused ? mFocusedCornerColor : mCornerColor); mStrokePaint.setColor(mFocused ? mFocusedCornerColor : mCornerColor);
// Draw background color. // Draw background color.
@@ -112,9 +116,10 @@ public class QrDecorateView extends View {
// Draw outer corner. // Draw outer corner.
mMaskCanvas.drawRoundRect(mOuterFrame, mRadius, mRadius, mStrokePaint); mMaskCanvas.drawRoundRect(mOuterFrame, mRadius, mRadius, mStrokePaint);
// Draw inner transparent corner. // Draw inner transparent corner.
mMaskCanvas.drawRoundRect(mInnerFrame, mInnerRidus, mInnerRidus, mTransparentPaint); mMaskCanvas.drawRoundRect(mInnerFrame, mInnerRadius, mInnerRadius, mTransparentPaint);
canvas.drawBitmap(mMaskBitmap, 0, 0, mBackgroundPaint); canvas.drawBitmap(mMaskBitmap, 0, 0, mBackgroundPaint);
}
super.onDraw(canvas); super.onDraw(canvas);
} }