首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替代SurfaceView?

替代SurfaceView?
EN

Stack Overflow用户
提问于 2012-11-14 12:03:33
回答 2查看 1.2K关注 0票数 4

我正在制作一个定制的ProgressBar,它有一个只旋转的位图。如果我使用View.invalidate,FPS会结巴;deltaTime会上升40+很多次。逻辑和呈现几乎是瞬时的,但无效调用使其速度变慢。因此,我正在尝试SurfaceView,问题是我之前遇到了问题,将SurfaceViews与其他视图组装在一起,我不想使用它。除了SurfaceView和View.invalidate之外,还有其他的选择吗?还是我被它们困住了?

编辑:

为了澄清更多问题,我正在制作一个自定义的视图,它是一个中间的 ProgressBar。所以视图就是ProgressBar。我现在也没有下载任何东西,我只是试图为我的观点获取最大的FPS。一些代码:

代码语言:javascript
复制
MyProgressBar extends View implements Runnable

和run()

代码语言:javascript
复制
calculateNewRotation();
invalidate();
post(this);

其中calculateNewRotation()

代码语言:javascript
复制
long now = SystemClock.uptimeMillis();
int deltaTime = (int) (now - mLastRender);
mLastRender = now;
mSpinRotation += deltaTime * SPIN_SPEED_PER_MILLISECOND_CLOCKWISE;

Post(这个)指的是MyProgressBar,它将永远循环,直到我不这么说为止。

在我的onDraw()

代码语言:javascript
复制
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。现在,有这样的观点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-14 14:33:23

最后我所做的是,当我画出图像时,我将旋转值更新为1。在快速和慢速的手机上,它看起来很平稳,但速度会有所不同。在一个快速电话上,它可能会画60帧每秒60度,当一个慢电话10帧每秒将使旋转速度达到每秒10度。最后,如果我想让它们以同样的速度旋转,或者让它看起来很好,我会选择后者。

编辑

我想我可以设置一个最大帧每秒,所以快速手机将被节流,从而使快速和小型手机之间的差距更小。

票数 0
EN

Stack Overflow用户

发布于 2012-11-14 12:30:21

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13378481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档