2012-06-19 105 views
0

我正在创建圣诞节倒计时,我需要每秒倒计时,并需要在画布上绘制多少天,几小时,几分钟和几秒到圣诞节。Android CountDownTimer和在画布上绘制

我可以得到工作输出,但我觉得有很好的方法来实现这一点,而不是我现在所做的。

这里是代码,我删除喜欢进口,未实现的方法等

public class SnowFall extends Activity { 

SampleView textDraw; 
Paint paint; 
Rect bounds; 
int durationMilli; 
Duration duration; 

static String days; 
static String hours; 
static String minutes; 
static String seconds; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Duration duration = new Duration(); 
    int futureTime = duration.cal_duration(); 
    MyTime tm = new MyTime(futureTime, 1000); 
    tm.start(); 

    textDraw = new SampleView(this); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    LinearLayout linearLayout = new LinearLayout(this); 
    linearLayout.setOrientation(LinearLayout.VERTICAL); 
    linearLayout.setBackgroundColor(Color.TRANSPARENT); 
    textDraw.setBackgroundDrawable(getResources().getDrawable(
      R.drawable.background_image_1)); 
    linearLayout.addView(textDraw); 
    setContentView(linearLayout); 

} 

public class MyTime extends CountDownTimer { 

    public MyTime(long millisInFuture, long countDownInterval) { 
     super(millisInFuture, countDownInterval); 

    } 

    @Override 
    public void onTick(long millisUntilFinished) { 

     SampleView view = new SampleView(getApplicationContext()); 
     int durationInMilliSec = (int) millisUntilFinished; 
     Log.d("Joda Time", String.valueOf(durationInMilliSec)); 

     try { 
      int x = durationInMilliSec/1000; 
      seconds = String.valueOf(x % 60); 
      x /= 60; 
      minutes = String.valueOf(x % 60); 
      x /= 60; 
      hours = String.valueOf(x % 24); 
      x /= 24; 
      days = String.valueOf(x); 

      view.invalidate(); 
     } catch (Exception e) { 

     } 

    } 

} 

private static class SampleView extends View { 
    private Paint mPaint; 
    private float mX; 
    private float[] mPos; 

    private Path mPath; 
    private Paint mPathPaint; 

    private static final int DY = 45; 
    private static final String POSTEXT = "Positioned"; 

    private static void makePath(Path p) { 
     p.moveTo(10, 0); 
     p.cubicTo(100, -50, 200, 50, 300, 0); 
    } 

    private float[] buildTextPositions(String text, float y, Paint paint) { 
     float[] widths = new float[text.length()]; 
     // initially get the widths for each char 
     int n = paint.getTextWidths(text, widths); 
     // now popuplate the array, interleaving spaces for the Y values 
     float[] pos = new float[n * 2]; 
     float accumulatedX = 0; 
     for (int i = 0; i < n; i++) { 
      pos[i * 2 + 0] = accumulatedX; 
      pos[i * 2 + 1] = y; 
      accumulatedX += widths[i]; 
     } 
     return pos; 
    } 

    public SampleView(Context context) { 
     super(context); 
     setFocusable(true); 

     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setTextSize(40); 
     Typeface typeface = Typeface.createFromAsset(context.getAssets(), 
       "font.ttf"); 
     mPaint.setTypeface(typeface); 

     mPos = buildTextPositions(POSTEXT, 0, mPaint); 

     mPath = new Path(); 
     makePath(mPath); 

     mPathPaint = new Paint(); 
     mPathPaint.setAntiAlias(true); 
     mPathPaint.setColor(0x800000FF); 
     mPathPaint.setStyle(Paint.Style.STROKE); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     Paint p = mPaint; 
     float x = mX; 
     float y = 0; 

     if (days != null && hours != null && minutes != null 
       && seconds != null) { 
      canvas.translate(0, DY); 
      p.setTextAlign(Paint.Align.CENTER); 
      canvas.drawText("There is", x, y, p); 

      canvas.translate(0, DY); 
      p.setTextAlign(Paint.Align.CENTER); 
      canvas.drawText(days + " Days, " + hours + " Hours", x, y, p); 

      canvas.translate(0, DY); 
      p.setTextAlign(Paint.Align.CENTER); 
      canvas.drawText(minutes + " Minutes and " + seconds 
        + " seconds", x, y, p); 

      canvas.translate(0, DY); 
      p.setTextAlign(Paint.Align.CENTER); 
      canvas.drawText("until christmas.", x, y, p); 

      invalidate(); 

     } else { 

      // draw the normal strings 
      canvas.translate(0, DY); 
      p.setTextAlign(Paint.Align.CENTER); 
      canvas.drawText("Something Wrong", x, y, p); 

      canvas.translate(0, DY); 
      p.setTextAlign(Paint.Align.CENTER); 
      canvas.drawText("Check your device time.", x, y, p); 

     } 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int ow, int oh) { 
     super.onSizeChanged(w, h, ow, oh); 
     mX = w * 0.5f; // remember the center of the screen 
    } 

} 

} 

一些不必要的代码和有小问题,有多少天算起,因为它表明,只有10天圣诞。我对Android上的图形一无所知,在这方面努力工作。

package in.isuru.animation; 

import org.joda.time.DateTime; 
import org.joda.time.Seconds; 

public class Duration { 

public int cal_duration(){ 
    DateTime start = new DateTime(DateTime.now()); 
    DateTime end = new DateTime(2012, 12, 25, 0, 0, 0 ,0); 
    int differenceSeconds = Seconds.secondsBetween(end, start).getSeconds(); 

    return differenceSeconds * 1000; 
} 

} 

问题是在每个Tick上计算天数,小时数,分钟数和秒数。请告诉我这是好还是还有更好的方法吗?

回答

0

你的号码是错误的,因为你用毫秒来溢出int数据类型。 int的最大值是2^31〜2×10^9。圣诞节前还有大约155×10^9毫秒的时间。

只需计算秒数,你会没事的。或者你可以使用64位的long而不是int。但是你乘以1000来获得毫秒,然后立即除以1000!这没有多大意义。

更好的是,通过你的乔达时间!

由于您已经在使用它,为什么不构建一个时期?

DateTime start = DateTime.now(); // Note your code makes an unneeded copy here 
DateTime end = new DateTime(2012, 12, 25, 0, 0, 0); 
Period p = new Period(start, end); 

该期限有吸气剂的年,月,日,小时,分钟,秒。这将完全避免容易出错的计算。

3

只是用这个简单的代码

countDownTimer = new CountDownTimer(240000, 1000) { 

    public void onTick(long millisUntilFinished) { 
     int seconds = (int) ((millisUntilFinished/1000)%60); 
     int minutes = (int) ((millisUntilFinished/1000)/60); 
     int hours = (int) ((millisUntilFinished/1000)/3600); 
     String startTime ="Time " + String.format("%02d:%02d:%02d",hours,minutes,seconds); 
     txtShowTimer.setText(startTime); 
    } 

    public void onFinish() { 
     txtShowTimer.setText("done!"); 
    } 
}.start(); 
+1

更好地解释这多一点点,让OP有更好的想法,为什么他没有这样做的权利。 – WiSaGaN