SurfaceView的替代品?

时间:2012-11-14 12:03:33

标签: android view surfaceview

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

修改

我想我可以放入每秒最大帧数,因此快速手机会被限制,从而使快速和小型手机之间的差距缩小。