我正在制作一个定制的ProgressBar,它有一个只旋转的位图。如果我使用View.invalidate,FPS会结巴;deltaTime会上升40+很多次。逻辑和呈现几乎是瞬时的,但无效调用使其速度变慢。因此,我正在尝试SurfaceView,问题是我之前遇到了问题,将SurfaceViews与其他视图组装在一起,我不想使用它。除了SurfaceView和View.invalidate之外,还有其他的选择吗?还是我被它们困住了?
编辑:
为了澄清更多问题,我正在制作一个自定义的视图,它是一个中间的 ProgressBar。所以视图就是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;Post(这个)指的是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() =1ms的时间。
onDraw() =1ms的时间。
问题是总时间往往在40 ms以上。我的解决方案是然后使用SurfaceView,但我不喜欢用透明像素绘制视图的想法,因此下面的曲面将被显示出来。我正在寻找的是一个视图,我可以得到任何时候我想要的画布,最好每16毫秒得到60 FPS。现在,有这样的观点吗?
发布于 2012-11-14 14:33:23
最后我所做的是,当我画出图像时,我将旋转值更新为1。在快速和慢速的手机上,它看起来很平稳,但速度会有所不同。在一个快速电话上,它可能会画60帧每秒60度,当一个慢电话10帧每秒将使旋转速度达到每秒10度。最后,如果我想让它们以同样的速度旋转,或者让它看起来很好,我会选择后者。
编辑
我想我可以设置一个最大帧每秒,所以快速手机将被节流,从而使快速和小型手机之间的差距更小。
发布于 2012-11-14 12:30:21
您是否在UI线程上执行长时间操作(通常是需要进度条的原因)?您的UI线程应该更新进度条,而另一个线程或异步任务处理长操作。
https://stackoverflow.com/questions/13378481
复制相似问题