Анимация с заданной скоростью с использованием canvas / Ondraw - PullRequest
1 голос
/ 03 сентября 2011

В моем приложении для 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++;
    }
}

}

Ответы [ 2 ]

0 голосов
/ 03 сентября 2011

Пользовательское представление будет недействительным, если оно является частью макета, который по какой-то причине перерисовывается. Поэтому вы можете обернуть свой код в onDraw () с условием и флагом, чтобы он рисовал ваши вещи только тогда, когда таймер устанавливает флаг и вызовы аннулируются. После того, как нарисована одна буква, флаг должен быть установлен в ложь, как:

if (drawLetter){
  drawLetter = false;

  /code...

}

Однако это также может быть синхронизированный блок.

0 голосов
/ 03 сентября 2011

OnDraw должен происходить 60 раз в секунду, а не только при аннулировании. Поэтому, возможно, вам нужно обновить некоторые переменные класса (когда вы делаете недействительными) и использовать их для своей логики отрисовки @ OnDraw.

...