在我的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++;
}
}
}
答案 0 :(得分:0)
OnDraw应该每秒发生60次,而不仅仅是在你无效时。 所以也许你需要更新一些类变量(当你失效时)并将它们用于你的绘制逻辑@ OnDraw。
答案 1 :(得分:0)
当布局的一部分由于某种原因重绘时,自定义视图将使自身无效。因此,您可以使用条件和标志在onDraw()中包含代码,以便仅在计时器设置标志并调用invalidate时才绘制您的内容。绘制一个字母后,标志应设置为false,如:
if (drawLetter){
drawLetter = false;
/code...
}
然而,这也可能需要是一个同步块。