Surfaces and shapes help you create and control the look of your app's screen and elements. They make your app look nice and easy to use.
Surface and shape in Android Kotlin
val surfaceView = SurfaceView(context)
surfaceView.holder.addCallback(object : SurfaceHolder.Callback {
override fun surfaceCreated(holder: SurfaceHolder) {
val canvas = holder.lockCanvas()
canvas.drawColor(Color.WHITE)
val paint = Paint().apply {
color = Color.RED
style = Paint.Style.FILL
}
canvas.drawCircle(100f, 100f, 50f, paint)
holder.unlockCanvasAndPost(canvas)
}
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {}
override fun surfaceDestroyed(holder: SurfaceHolder) {}
})SurfaceView provides a dedicated drawing surface embedded inside your app's view hierarchy.
You use SurfaceHolder.Callback to know when the surface is ready to draw on.
val shapeDrawable = ShapeDrawable(OvalShape()) shapeDrawable.paint.color = Color.BLUE shapeDrawable.setBounds(50, 50, 200, 200) shapeDrawable.draw(canvas)
val rect = RectF(10f, 10f, 150f, 150f) canvas.drawRoundRect(rect, 20f, 20f, paint)
This custom SurfaceView draws a green rectangle on a white background when the surface is ready.
class MySurfaceView(context: Context) : SurfaceView(context), SurfaceHolder.Callback { private val paint = Paint().apply { color = Color.GREEN style = Paint.Style.FILL } init { holder.addCallback(this) } override fun surfaceCreated(holder: SurfaceHolder) { val canvas = holder.lockCanvas() canvas.drawColor(Color.WHITE) canvas.drawRect(50f, 50f, 250f, 150f, paint) holder.unlockCanvasAndPost(canvas) } override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {} override fun surfaceDestroyed(holder: SurfaceHolder) {} }
Always unlock the canvas after drawing to display your changes.
SurfaceView is useful for animations or games where you need fast drawing.
Use Paint to set colors, styles, and effects for your shapes.
SurfaceView gives you a special area to draw graphics directly.
Use shapes and Paint to create colorful and styled drawings.
Remember to manage the surface lifecycle with SurfaceHolder.Callback.
Practice
SurfaceView in Android development?Solution
Step 1: Understand SurfaceView role
SurfaceView provides a special area where you can draw graphics directly on a separate thread.Step 2: Compare with other options
Handling input, navigation, or static text are not the main roles of SurfaceView.Final Answer:
To provide a dedicated drawing surface for custom graphics -> Option AQuick Check:
SurfaceView = Dedicated drawing surface [OK]
- Confusing SurfaceView with View for UI controls
- Thinking SurfaceView handles navigation
- Assuming SurfaceView manages text display
SurfaceView canvas in Kotlin?Solution
Step 1: Identify correct SurfaceHolder methods
To draw on SurfaceView, use surfaceHolder.lockCanvas() to get Canvas and unlockCanvasAndPost() to post.Step 2: Check method names and usage
Only val canvas = surfaceHolder.lockCanvas() canvas.drawColor(Color.RED) surfaceHolder.unlockCanvasAndPost(canvas) uses correct methods: lockCanvas(), drawColor(), unlockCanvasAndPost().Final Answer:
val canvas = surfaceHolder.lockCanvas()\ncanvas.drawColor(Color.RED)\nsurfaceHolder.unlockCanvasAndPost(canvas) -> Option DQuick Check:
lockCanvas + unlockCanvasAndPost = correct drawing flow [OK]
- Using non-existent methods like getCanvas()
- Calling unlockCanvas() instead of unlockCanvasAndPost()
- Trying to draw directly on SurfaceView without Canvas
val paint = Paint() paint.color = Color.BLUE val canvas = surfaceHolder.lockCanvas() canvas.drawRect(0f, 0f, 100f, 100f, paint) surfaceHolder.unlockCanvasAndPost(canvas)
Solution
Step 1: Analyze Paint color setting
Paint color is set to Color.BLUE, so drawing uses blue color.Step 2: Check drawing command
drawRect draws a rectangle with the paint color on the canvas.Final Answer:
Blue rectangle -> Option AQuick Check:
Paint.color = BLUE means rectangle is blue [OK]
- Assuming default color is red
- Thinking drawRect clears canvas
- Ignoring paint color setting
val canvas = surfaceHolder.lockCanvas() canvas.drawCircle(50f, 50f, 30f, paint)
Solution
Step 1: Check drawing sequence
After lockCanvas(), you must call unlockCanvasAndPost(canvas) to display the drawing.Step 2: Verify other options
drawCircle is valid, paint may be initialized, and coordinates are reasonable.Final Answer:
Missing call to unlockCanvasAndPost(canvas) after drawing -> Option BQuick Check:
unlockCanvasAndPost needed to show drawing [OK]
- Forgetting to post canvas after drawing
- Confusing drawCircle with drawOval
- Assuming drawing appears without unlock
Solution
Step 1: Understand fill and stroke styles
To draw a filled shape with border, use Paint.Style.FILL for fill and Paint.Style.STROKE for border.Step 2: Check colors and order
Fill should be red, stroke black with strokeWidth set. Drawing fill first then stroke overlays border correctly.Final Answer:
Code with red fill and black stroke paints drawn in order -> Option CQuick Check:
Fill + Stroke paints = red circle with black border [OK]
- Using stroke style for fill color
- Drawing stroke before fill causing border hidden
- Not setting strokeWidth for border thickness
Ready to prove it?
Pass the test and this pattern moves unknown
