4

我正在制作一个自定义 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。现在,有这样的观点吗?

4

2 回答 2

1

您是否在 UI 线程上进行了长时间的操作(通常是需要进度条的原因)?您的 UI 线程应该在另一个线程或异步任务处理长操作时更新进度条。

于 2012-11-14T12:30:21.400 回答
0

我最终所做的是,当我绘制图像时,我将旋转值更新 1。在快速和慢速手机上,它看起来会很平滑,但速度会有所不同。在快速手机上,它可能每秒绘制 60 帧,即每秒 60 度,而每秒 10 帧的慢速手机会使旋转每秒旋转 10 度。所以说到底,如果我想让它们以相同的速度旋转或让它看起来不错,我会选择后者。

编辑

我想我可以设置每秒最大帧数,这样快速手机就会受到限制,从而缩小快速手机和小型手机之间的差距。

于 2012-11-14T14:33:23.643 回答