What is the purpose of the <code>Canvas</code> class in Android custom drawing?
The <code>Canvas</code> class provides the drawing surface on which you can draw shapes, text, and images in custom views.
Click to reveal answer
beginner
Which method do you override to perform custom drawing in an Android View?
You override the onDraw(canvas: Canvas) method to perform custom drawing on the view's canvas.
Click to reveal answer
beginner
What is the role of the Paint object when drawing on a Canvas?
The Paint object defines the style and color used for drawing shapes, text, and bitmaps on the canvas.
Click to reveal answer
intermediate
Why should you avoid creating new objects inside the onDraw method?
Creating new objects inside onDraw can cause performance issues because this method is called frequently during rendering.
Click to reveal answer
beginner
How can you trigger a redraw of a custom view in Android?
Call the invalidate() method on the view to request a redraw, which will call onDraw again.
Click to reveal answer
Which method provides the canvas to draw on in a custom Android view?
AonCreate()
BonDraw(canvas: Canvas)
ConStart()
DonMeasure()
✗ Incorrect
The onDraw(canvas: Canvas) method is where you receive the canvas to perform custom drawing.
What does the Paint object control when drawing on a canvas?
AThe style and color of what is drawn
BThe size of the canvas
CThe layout of the view
DThe touch events
✗ Incorrect
Paint defines color, style, stroke width, and other drawing attributes.
Why is it important to avoid creating new objects inside onDraw?
AIt slows down drawing performance
BIt causes the app to crash
CIt changes the canvas size
DIt disables touch events
✗ Incorrect
Creating objects in onDraw can slow down rendering because it is called many times.
How do you request a view to redraw itself?
Acall <code>refresh()</code>
Bcall <code>draw()</code>
Ccall <code>start()</code>
Dcall <code>invalidate()</code>
✗ Incorrect
Calling invalidate() tells the system to redraw the view by calling onDraw.
Which of these can you draw on a Canvas?
AShapes like circles and rectangles
BText
CAll of the above
DImages (bitmaps)
✗ Incorrect
Canvas supports drawing shapes, text, and images.
Explain how to create a simple custom view that draws a red circle using Canvas and Paint.
Think about what you do inside onDraw and how Paint affects drawing.
You got /3 concepts.
Describe why performance matters in custom drawing and how to optimize your onDraw method.
Consider how often onDraw is called and what slows it down.
You got /3 concepts.
Practice
(1/5)
1. What is the primary purpose of the onDraw() method in Android custom views?
easy
A. To manage view layout and positioning
B. To draw shapes and graphics on the screen using a Canvas
C. To handle user touch events
D. To load images from resources
Solution
Step 1: Understand the role of onDraw()
The onDraw() method is called when the view needs to display its content.
Step 2: Identify what onDraw() uses
It uses a Canvas object to draw shapes, text, or images directly on the view.
Final Answer:
To draw shapes and graphics on the screen using a Canvas -> Option B
Quick Check:
onDraw() draws on Canvas [OK]
Hint: Remember: onDraw() is for drawing only [OK]
Common Mistakes:
Confusing onDraw() with event handlers
Thinking onDraw() manages layout
Assuming onDraw() loads images automatically
2. Which of the following is the correct way to create a Paint object with red color and stroke style in Kotlin?
easy
A. val paint = Paint.setColor(Color.RED).setStyle(Paint.Style.STROKE)
B. val paint = Paint(Color.RED, Paint.Style.STROKE)
C. val paint = Paint().apply { color = Color.RED; style = Paint.Style.STROKE }
D. val paint = Paint(Color.RED).style(Paint.Style.STROKE)
Solution
Step 1: Check Paint object creation syntax
In Kotlin, Paint is created with default constructor and properties set via setters or apply block.
Step 2: Verify correct property assignments
Using apply allows setting color and style properly.
Final Answer:
val paint = Paint().apply { color = Color.RED; style = Paint.Style.STROKE } -> Option C
Quick Check:
Use apply to set Paint properties [OK]
Hint: Use apply block to set Paint properties cleanly [OK]
Common Mistakes:
Trying to pass parameters to Paint constructor
Using chained setters that don't exist
Confusing method calls with property assignments
3. Given the following onDraw() code snippet, what shape will be drawn?
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val paint = Paint().apply { color = Color.BLUE; style = Paint.Style.FILL }
canvas.drawCircle(100f, 100f, 50f, paint)
}
medium
A. A blue filled circle centered at (100, 100) with radius 50
B. A blue outlined circle centered at (100, 100) with radius 50
C. A red filled circle centered at (100, 100) with radius 50
D. A blue filled rectangle at (100, 100) with size 50
Solution
Step 1: Analyze Paint properties
Paint color is blue and style is FILL, so shape will be filled blue.
Step 2: Identify Canvas drawing method
drawCircle draws a circle at (100f, 100f) with radius 50f.
Final Answer:
A blue filled circle centered at (100, 100) with radius 50 -> Option A
Quick Check:
drawCircle + FILL + blue = filled blue circle [OK]
Hint: Look at Paint style and Canvas method to identify shape [OK]
Common Mistakes:
Confusing FILL with STROKE style
Mixing up circle and rectangle drawing methods
Ignoring Paint color property
4. Identify the error in this custom view's onDraw() method:
override fun onDraw(canvas: Canvas) {
val paint = Paint()
paint.color = Color.GREEN
canvas.drawRect(50f, 50f, 150f, 150f)
medium
A. Missing Paint parameter in drawRect call
B. Paint color should be set after drawRect
C. drawRect requires integer coordinates, not floats
D. onDraw should not create Paint objects
Solution
Step 1: Check drawRect method parameters
The drawRect method requires a Paint object as the last parameter to know how to draw.
Step 2: Identify missing argument
The code calls drawRect with only coordinates, missing the Paint parameter.
Final Answer:
Missing Paint parameter in drawRect call -> Option A
Quick Check:
drawRect needs Paint argument [OK]
Hint: Always pass Paint to Canvas draw methods [OK]
Common Mistakes:
Forgetting Paint parameter in draw calls
Thinking Paint color order matters
Assuming floats are invalid for coordinates
5. You want to draw a custom view that shows a red circle with a black stroke border of 5 pixels thickness. Which of the following onDraw() implementations achieves this correctly?
hard
A. override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val paint = Paint().apply { color = Color.RED; style = Paint.Style.FILL; strokeWidth = 5f }
canvas.drawCircle(100f, 100f, 50f, paint)
}
B. override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val paint = Paint().apply { color = Color.RED; style = Paint.Style.STROKE; strokeWidth = 5f }
canvas.drawCircle(100f, 100f, 50f, paint)
}
C. override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val paint = Paint().apply { color = Color.BLACK; style = Paint.Style.FILL }
canvas.drawCircle(100f, 100f, 50f, paint)
}
D. override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val fillPaint = Paint().apply { color = Color.RED; style = Paint.Style.FILL }
val strokePaint = Paint().apply { color = Color.BLACK; style = Paint.Style.STROKE; strokeWidth = 5f }
canvas.drawCircle(100f, 100f, 50f, fillPaint)
canvas.drawCircle(100f, 100f, 50f, strokePaint)
}
Solution
Step 1: Understand the requirement
We need a red filled circle with a black stroke border of 5 pixels thickness.
Step 2: Check each option's drawing logic
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val fillPaint = Paint().apply { color = Color.RED; style = Paint.Style.FILL }
val strokePaint = Paint().apply { color = Color.BLACK; style = Paint.Style.STROKE; strokeWidth = 5f }
canvas.drawCircle(100f, 100f, 50f, fillPaint)
canvas.drawCircle(100f, 100f, 50f, strokePaint)
} draws the filled circle first, then draws the stroke circle on top with correct colors and stroke width.
Step 3: Identify why others fail
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val paint = Paint().apply { color = Color.RED; style = Paint.Style.STROKE; strokeWidth = 5f }
canvas.drawCircle(100f, 100f, 50f, paint)
} only draws a red stroke, no fill. override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val paint = Paint().apply { color = Color.BLACK; style = Paint.Style.FILL }
canvas.drawCircle(100f, 100f, 50f, paint)
} draws a black filled circle only. override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val paint = Paint().apply { color = Color.RED; style = Paint.Style.FILL; strokeWidth = 5f }
canvas.drawCircle(100f, 100f, 50f, paint)
} sets strokeWidth but style is FILL, so no stroke border.
Final Answer:
Uses two Paint objects: red FILL then black STROKE with 5f width -> Option D
Quick Check:
Draw fill then stroke with separate Paints [OK]
Hint: Use two Paints: one FILL red, one STROKE black [OK]
Common Mistakes:
Using strokeWidth with FILL style only
Drawing stroke before fill causing overlap issues
Using one Paint for both fill and stroke
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.