如何每100毫秒或更短时间刷新“onDraw()”以移动“位图”

时间:2018-01-26 16:52:34

标签: android kotlin

我想将“位图”从上到下,然后从下到上移动。

在“y1”增加或减少之后,我使用“invalidate()”来刷新“onDraw()”,一切正常,但“位图”运动非常慢。

我可以像“y1 + = 15”那样增加或减少y1,但“位图”会移动不顺畅

我希望每100毫秒或更短时间刷新“onDraw()”。 怎么做?

This screenshot

package com.example.duc25.runningman  


import android.content.Context
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Paint
import android.util.Log
import android.view.MotionEvent
import android.view.View
import android.widget.Toast
import java.util.*

class Man(contex: Context, var screenW: Float, var screenH: Float): View(contex){
    var bitmap1 = BitmapFactory.decodeResource(resources, R.drawable.step1)
    var x1: Float = 0F
    var y1: Float = 0F
    var boolean1: Boolean = true

    override fun onTouchEvent(event: MotionEvent): Boolean{
        if(event.action === MotionEvent.ACTION_DOWN){
            if(boolean1 == true){
                boolean1 = false
            }else{
                boolean1 = true
            }
        }

        return true
    }

    override fun onDraw(canvas: Canvas){
        set_X(canvas)

        if (boolean1) {
            if (y1 <= (screenH / 100) * 70){
                y1 += 1F
            }else{
                boolean1 = false
            }
        }else{
            if(y1 >= 0) {
                y1 -= 1F
            }else{
                boolean1 = true
            }
        }
        invalidate()
    }

    fun set_X(canvas: Canvas) {
        val paint = Paint(Paint.ANTI_ALIAS_FLAG)
        canvas.drawBitmap(bitmap1, x1, y1, paint)
    }
}

1 个答案:

答案 0 :(得分:0)

您可能希望使用postInvalidateOnAnimation(),而不是使用invalidate()。这将以60 fps或每16毫秒的速度触发动画。

如果你想要更慢的fps(你可能想要60 fps),你也可以使用某种postInvalidateDelayed()

我猜你会因为你用invalidate()重复发送主线程而陷入滞后。如果你在使用postInvalidateOnAnimation()时仍然处于滞后状态,那么你在每个动画帧上所做的事情太重了,你必须找到一种方法让它更便宜/更快。

编辑:其他一些提示。 1.您正在为每个动画帧创建Paint。那很糟。我建议您将val paint = Paint(Paint.ANTI_ALIAS_FLAG)移动到班级顶部的属性中,即使用y1x1属性。 2. bitmap1可以是val而不是var