我想将“位图”从上到下,然后从下到上移动。
在“y1”增加或减少之后,我使用“invalidate()”来刷新“onDraw()”,一切正常,但“位图”运动非常慢。
我可以像“y1 + = 15”那样增加或减少y1,但“位图”会移动不顺畅
我希望每100毫秒或更短时间刷新“onDraw()”。 怎么做?
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)
}
}
答案 0 :(得分:0)
您可能希望使用postInvalidateOnAnimation(),而不是使用invalidate()
。这将以60 fps或每16毫秒的速度触发动画。
如果你想要更慢的fps(你可能想要60 fps),你也可以使用某种postInvalidateDelayed()。
我猜你会因为你用invalidate()
重复发送主线程而陷入滞后。如果你在使用postInvalidateOnAnimation()
时仍然处于滞后状态,那么你在每个动画帧上所做的事情太重了,你必须找到一种方法让它更便宜/更快。
编辑:其他一些提示。
1.您正在为每个动画帧创建Paint
。那很糟。我建议您将val paint = Paint(Paint.ANTI_ALIAS_FLAG)
移动到班级顶部的属性中,即使用y1
和x1
属性。
2. bitmap1
可以是val
而不是var
。