Android 使用canvas/Ondraw以指定速率制作动画

Android 使用canvas/Ondraw以指定速率制作动画,android,canvas,ondraw,Android,Canvas,Ondraw,在我的Android应用程序中,我试图一个接一个地显示字母,每个字母之间有一个短暂的延迟,同时为每个字母播放一个声音。我让一切正常,声音播放有正确的延迟,但文本总是打印到屏幕上的速度太快。即使我没有明确地使视图无效,画布似乎也会更新 这是我到目前为止所做的-我还尝试了一个基于“蛇”示例的变体,得到了相同的结果。。。任何帮助都将不胜感激 public class SpellingView extends View { private static final String WORD = "TRUC

在我的Android应用程序中,我试图一个接一个地显示字母,每个字母之间有一个短暂的延迟,同时为每个字母播放一个声音。我让一切正常,声音播放有正确的延迟,但文本总是打印到屏幕上的速度太快。即使我没有明确地使视图无效,画布似乎也会更新

这是我到目前为止所做的-我还尝试了一个基于“蛇”示例的变体,得到了相同的结果。。。任何帮助都将不胜感激

public class SpellingView extends View {
private static final String WORD = "TRUCK";
int width;
int height;
String textToPrint;
float textspace;
int j=0;

private final Path arc;
private final Paint tPaint;

//constructor for SpellingView
public SpellingView(Context context) {
    super(context);
    arc = new Path();
    tPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    displayLetterLoop();
}

public void displayLetterLoop(){

    for (int i = 0; i < WORD.length(); i++){
        final Runnable mUpdateUITimerTask = new Runnable() {
            public void run() { 
                Spelling.mp.start();    
            }
        };
        final Handler mHandler = new Handler();
        mHandler.postDelayed(mUpdateUITimerTask, i*1500);
    }
}

@Override
protected void onDraw(Canvas canvas) {
    int k;
    // Drawing commands go here
    width = canvas.getWidth();
    height = canvas.getHeight();

    arc.addArc(new RectF((width*.15f), (height*.15f), (width*.85f), (height*.4f)), 180,180);

    tPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    tPaint.setColor(Color.RED);
    tPaint.setTextSize(height * 0.1f);
    tPaint.setTextAlign(Paint.Align.LEFT);

    setBackgroundColor(Color.BLACK);

    for (k = 0; k < j; k++){
        char c = WORD.charAt(k);        
        String cs = Character.toString(c);
        textToPrint+= cs;
        textspace =(float) (k*(width/WORD.length())*.9);

        canvas.drawTextOnPath(cs, arc, textspace , 0, tPaint);
    }
    if(j<WORD.length()){
        j++;
    }
}
公共类拼写视图扩展视图{
专用静态最终字符串WORD=“TRUCK”;
整数宽度;
内部高度;
字符串文本打印;
浮动文本空间;
int j=0;
专用最终路径弧;
私人最终油漆;
//SpellingView的构造函数
公共拼写视图(上下文){
超级(上下文);
弧=新路径();
t油漆=新油漆(油漆.防油漆标记);
displayLetterLoop();
}
public void displayLetterLoop(){
for(int i=0;iif(jOnDraw应该每秒发生60次,而不仅仅是在无效时。

因此,您可能需要更新一些类变量(当您失效时),并将它们用于绘制逻辑@OnDraw。

自定义视图作为布局的一部分时,由于某种原因会使自身失效。因此,您可以将代码封装在OnDraw()中有一个条件和一个标志,只有当计时器设置标志并调用invalidate时,它才会绘制您的内容。绘制一个字母后,标志应设置为false,如:

if (drawLetter){
  drawLetter = false;

  /code...

}
然而,这也可能需要同步化块