我正在制作一个自定义ProgressBar,它有一个只旋转的位图。如果我使用View.invalidate,FPS将会断断续续; deltaTime将多次上升40+。逻辑和渲染几乎是瞬时的,但无效调用使它变慢。所以我正在尝试SurfaceView,问题是我早先将SurfaceViews与其他视图组装在一起有问题,我不想使用它。有没有SurfaceView和View.invalidate的替代品,还是我坚持使用它们?
修改
为了澄清更多内容,我正在制作一个自定义查看,即中间 ProgressBar。因此View是ProgressBar。我现在也没有下载任何东西,我只想为我的视图获得最大FPS。一些代码:
MyProgressBar extends View implements Runnable
和run()
calculateNewRotation();
invalidate();
post(this);
其中calculateNewRotation()
long now = SystemClock.uptimeMillis();
int deltaTime = (int) (now - mLastRender);
mLastRender = now;
mSpinRotation += deltaTime * SPIN_SPEED_PER_MILLISECOND_CLOCKWISE;
发帖(这个)指的是MyProgressBar,它会永远循环,直到我说不然。
在我的onDraw()
中mCamera.save();
mCamera.rotateZ(mSpinRotation);
mCamera.getMatrix(mMatrix);
mCamera.restore();
mMatrix.preTranslate(-mTranslatePivotX, -mTranslatePivotY);
mMatrix.postTranslate(mTranslatePivotX + mCenterX, mTranslatePivotY + mCenterY);
canvas.drawBitmap(mSpinBitmap, mMatrix, mSpinBitmapPaint);
calculateNewRotation()的时间= 1毫秒。
onDraw()的时间= 1毫秒。
问题是整体时间通常在40毫秒以上。我的解决方案是使用SurfaceView,但是我不喜欢使用透明像素绘制其表面的视图,因此将显示底层表面。我正在寻找的是一个视图,我可以随时获得画布,最好每16毫秒获得60 FPS。现在,有这样的观点吗?
答案 0 :(得分:1)
你是否在UI线程上进行了长时间的操作(通常是需要进度条的原因)?您的UI线程应该更新进度条,而另一个线程或异步任务处理长操作。
答案 1 :(得分:0)
我最终做的是当我绘制图像时我将旋转值更新为1.在快速和慢速手机上它看起来会很平滑,但速度会有所不同。在快速手机上它可以每秒画60帧,即每秒60度,而每秒10帧的慢速手机将使旋转速度达到每秒10度。所以最后,如果我希望它们以相同的速度旋转或使它看起来很好,我选择后者。
修改强>
我想我可以放入每秒最大帧数,因此快速手机会被限制,从而使快速和小型手机之间的差距缩小。