【问题标题】:kotlin canvas.drawRect draws outside of the canvaskotlin canvas.drawRect 在画布之外绘制
【发布时间】:2021-05-27 14:34:45
【问题描述】:

所以我试图在 kotlin 中绘制一个矩形,并且我有一个可以执行此操作的类,但我需要画布的大小来执行此操作,因此在我的主视图中,我在 onDraw( ) 函数,类似这样。

主视图

var rectangle = Rectangle()
override fun onDraw(canvas:Canvas) {
    super.onDraw(canvas)
    rectangle.setNewCanvas(canvas)

    rectangle.show()
    rectangle.update()

    invalidate()
}

class Rectangle {
    private var canvas: Canvas? = null
    var x = 0
    var speed = 10
    fun setNewCanvas(newCanvas: Canvas)
        if(canvas == null) {
            canvas = newCanvas
            x = canvas?.width!!
        }
    }

    fun show() {
        canvas?.drawRect(x.toFloat(), 0F, x.toFloat() - 100, 1000F, Paint(Color.RED))
    }

    fun update() {
        x -= speed
    }
}

我试图让矩形在屏幕上移动,但是当我检查 setNewCanvas() 中的画布是否为空时,它会移动,但矩形是在应用程序项目名称所在的横幅中的画布上方绘制的。如果我不检查 canvas 是否为空,那么每次调用都会将 x 的值重新分配给宽度,因此矩形永远不会移动。

【问题讨论】:

    标签: android android-studio kotlin canvas graphics


    【解决方案1】:

    我觉得你不应该把修改坐标的功能封装成Rectangle,不能重复设置canvas。

    var x = 0
    var speed = 10
    
    fun update() {
      x -= speed
    }
    
    override fun onDraw(canvas:Canvas) {
        canvas.drawRect(x.toFloat(), 0F, x.toFloat() - 100, 1000F, Paint(Color.RED))
        rectangle.update()
        invalidate()
    }
    
    

    【讨论】:

    • 但是我没有重复设置,每次调用setNewCanvas()时我都会检查canvas是否为null。为什么封装坐标修饰符不好?我应该在 Rectangle 中有这样的东西吗?有趣的更新(速度){ x -= 速度 }
    • 我知道在你的代码中每次调用show()都会检测canvas是否是null,但我认为这没有效果。因为如果需要将canvas对象传递给自己定义的show()函数,也可以通过show(canvas)这种方式传递参数。在onDraw() 中,画布对象不得为null。绘图功能可以在onDraw()函数中完成,包括更新坐标,invalidate可以在onDraw()中完成。
    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多