以下是一些相关的代码:
public class TimeSpinner extends View
{
.....
private void initialize()
{
.....
handler = new Handler();
repetitiveRunnable = new Runnable() {
@Override
public void run() {
updateData();
}
};
}
public void updateData() {
float delta = 3;
mDigitY += delta;
mDigitAboveY += delta;
mDigitBelowY += delta;
//Test if animation needs to stop
if (mCurrentDigit == animateToDigit) {
handler.removeCallbacks(repetitiveRunnable);
} else {
handler.postDelayed(repetitiveRunnable, 5);
}
invalidate();
}
public void startLoadingDigit() {
handler.postDelayed(repetitiveRunnable, 5);
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
canvas.drawText(mDigitString, mDigitX, mDigitY, mDigitPaint);
canvas.drawText(mDigitAboveString, mDigitX, mDigitAboveY, mDigitPaint);
canvas.drawText(mDigitBelowString, mDigitX, mDigitBelowY, mDigitPaint);
}
}
问题在于UI线程还需要在其他视图上进行绘制,所以根据手机速度的不同,动画可能不够流畅。就像帧率不佳或有时会停顿半秒钟。在功能强大的设备上效果还可以。
现在问题来了,我该怎么做才能使动画平滑,而不受应用程序正在执行的影响?这个View很简单,不是SurfaceView。我是否应该使用某种线程?提供一些代码示例将会很棒。
后来我尝试使用AsycTask更新Y坐标。
public class TimeSpinnerTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
while (animationRunning) {
updateData();
publishProgress();
try {
Thread.sleep(35);
} catch (InterruptedException e) {
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
invalidate();
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void result) {
invalidate();
super.onPostExecute(result);
}
}
public void updateData() {
mDigitY += delta;
mDigitAboveY += delta;
mDigitBelowY += delta;
if (mDigitAboveY > findCenterY(mCurrentDigit)) {
setCurrentDigit(mDigitAbove);
}
if (mCurrentDigit == animateToDigit) {
animationRunning = false;
setCurrentDigit(animateToDigit);
}
}
尽管看起来更加流畅,但在旧设备上仍然会出现卡顿,有时甚至会在暂停1秒后才继续动画。
asynctask是通过executeOnExecutor启动的,并且该视图显示在Android Maps V2的地图控件上。当地图正在加载瓦片时,就会出现卡顿。
也许我没有选择最佳方法。这是我想要获得的最终结果:
![enter image description here](https://istack.dev59.com/caPEr.gif)