我正在制作一个自定义 ProgressBar,它有一个可以旋转的位图。如果我使用 View.invalidate FPS 会卡顿;deltaTime 将增加 40 多次。逻辑和渲染几乎是即时的,但无效调用使其变慢。所以我正在尝试 SurfaceView,问题是我之前在将 SurfaceView 与其他视图组装时遇到了问题,我不想使用它。SurfaceView 和 View.invalidate 是否有任何替代方案,或者我是否坚持使用它们?
编辑:
为了进一步澄清,我正在制作一个作为中间ProgressBar的自定义视图。所以 View 就是 ProgressBar。我现在也没有下载任何东西,我只是想为我的视图获得最大 FPS。一些代码:
MyProgressBar extends View implements Runnable
和运行()
calculateNewRotation();
invalidate();
post(this);
在哪里计算NewRotation()
long now = SystemClock.uptimeMillis();
int deltaTime = (int) (now - mLastRender);
mLastRender = now;
mSpinRotation += deltaTime * SPIN_SPEED_PER_MILLISECOND_CLOCKWISE;
Post(this) 指的是 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,但我不喜欢使用透明像素绘制其表面的 View 的想法,因此将显示底层表面。我正在寻找的是一个视图,我可以随时获得画布,最好每 16 毫秒获得 60 FPS。现在,有这样的观点吗?