从MainActivity调用Invalidate不会执行OnDraw

时间:2018-03-03 21:30:55

标签: android kotlin android-view

所以我在android中尝试了kotlin,并想开始在视图上画一个圆圈,在那里我得到一个触摸输入。它工作正常,当我在View-Class中有onTouchEvent时,但我想把逻辑放在图形部分之外,所以我在视图类中创建了一个方法,它改变了圆的坐标并调用了invalidate() 。现在我将onTouchEvent放入MainActivity并使用新坐标调用方法。我可以通过system.out.println()看到这些方法,但是invalidate()不会调用Draw(),因此圆圈不会改变。我认为这个问题有一个简单的解决方案,但我找不到它。所以我很乐意得到一些帮助。

这是我的代码:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(GameView(this))


    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {

      GameView(this).updateCircle(event!!.x,event!!.y)
      return true
    }

}

MainActivity.kt

class GameView(context: Context): View(context) {

  val paint : Paint
  var circleX : Float
  var circleY : Float


  init {
      paint = Paint();
      paint.isFilterBitmap = true;
      paint.isAntiAlias = true;
      paint.color = Color.YELLOW;
      circleX = 100f;
      circleY = 100f;

  }

  override fun onDraw(canvas: Canvas?) {
      System.out.println("Gets Called")
      super.onDraw(canvas)
      canvas?.drawColor(Color.WHITE);
      canvas?.drawCircle(circleX,circleY,50f,paint)
  }



  fun drawGrid(height: Int,width: Int){

  }

  fun updateCircle(x:Float,y:Float){

      circleX = x
      circleY = y          
      invalidate()
      System.out.println(circleX)
  }

}

GameView.kt

0 个答案:

没有答案