【发布时间】:2014-03-21 08:56:01
【问题描述】:
我有一个自定义视图,它看起来像一个数字从 0 到 9 的旋转轮。 基本上,当我从服务器下载某些内容时,它会从 0 向下滚动到 9,当返回值时,动画就会停止。动画是通过更新我正在绘制的文本的 Y 值来制作的
一些相关代码:
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 秒钟然后继续。
异步任务以executeOnExecutor 启动,视图显示在 Android Maps V2 的地图控件上。尤其是在地图加载图块时会出现模板。
也许我没有采用最好的方法。这是我想要获得的最终结果: 有什么想法吗?
【问题讨论】:
-
您的帖子延迟了 5 毫秒?这意味着 200 fps,为什么?
-
每个 postDelayed 将 3 添加到 Y 坐标...在 5 毫秒时,我得到了合理的速度。这可能与不使用单独的线程有关......
-
然后使用自定义动画,覆盖 applyTransformation 并根据其 interpolatedTime 更改 Y 坐标
-
@pskink 我不认为这很容易。由于我正在制作动画,因此我需要在屏幕上显示 2 个数字,当滚动发生时,我不确定是否可以使用动画来实现。
-
一个放在 Y 上,第二个放在 Y + SOMECONSTANTOFFSET 上?对吗?
标签: android multithreading android-animation android-custom-view