android - 尝试在空对象引用上调用虚拟方法“void android.graphics.Canvas.drawText()”
问题描述
我想在屏幕上绘制文本,但收到错误消息:
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void android.graphics.Canvas.drawText(java.lang.String, float, float, android.graphics.Paint)'
我的代码:
package com.example.root.runningmanv2
import android.content.Context
import android.graphics.Paint
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.SurfaceView
import android.view.WindowManager
class GamingActivity : AppCompatActivity() {
private lateinit var gameView: SurfaceGame
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//set fullscreen
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN)
gameView = SurfaceGame(this)
setContentView(gameView)
}
override fun onPause() {
super.onPause()
}
override fun onResume() {
super.onResume()
gameView.start()
}
inner class SurfaceGame(context: Context): SurfaceView(context), Runnable{
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
val ourHolder = holder
val canvas = ourHolder.lockCanvas()
fun start(){
val thread = Thread(this)
thread.start()
}
override fun run() {
drawFigure()
}
fun drawFigure(){
paint.setARGB(255, 255, 255, 255)
canvas.drawText("Hello", 500f, 500f, paint)
ourHolder.unlockCanvasAndPost(canvas)
}
}
}
如何解决?
解决方案
而不是自己在SurfaceGame类中获取持有者,而是从SurfaceView.Callback获取它
class GamingActivity : SurfaceHolder.Callback, AppCompatActivity() {
private var holder: SurfaceHolder? = null
private var pos = 0
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val view = SurfaceView(this)
setContentView(view)
view.holder.addCallback(this)
}
override fun surfaceCreated(holder: SurfaceHolder) {
this.holder = holder
pos = 0
Thread({
while (this.holder != null) {
drawFigure(this.holder)
Thread.sleep(100)
}
}).start()
}
override fun surfaceChanged(holder: SurfaceHolder, frmt: Int, w: Int, h: Int) {
this.holder = holder
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
this.holder = null
}
private fun drawFigure(holder: SurfaceHolder?) {
if (holder == null) return
val canvas = holder.lockCanvas()
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
paint.setARGB(255, 0, 0, 0)
paint.textSize = 96f
canvas.drawText("Hello", 100f + pos, 500f, paint)
pos++
holder.unlockCanvasAndPost(canvas)
}
}
推荐阅读
- rust - 如何解决闭包中的生命周期冲突?
- shopware - 适用于 Doofinder 插件的 Shopware 产品导出提要
- node.js - 使用 PassportJS 进行管理员登录
- kubernetes - Kubernetes pod DNS 解析
- regex - 如何从 Postgres 中的模式搜索中忽略特定的单词或字符集
- python - 下载文件页面的 NoReverseMatch 错误
- rust - 如何生成一个球体并将其传递给资产加载器
- amazon-web-services - AWS Blue/Green ECS 部署中的 Codebuild 在执行命令时返回错误:docker build -t :latest
- python - 为什么我的学习率会下降,即使损失正在改善?
- python - 重新索引数据帧多索引