0

私はクリスマスのカウントダウンを作成しています。毎秒カウントダウンする必要があり、クリスマスまで何日、何時間、何分、何秒をキャンバスに描く必要があります。

作業出力を得ることができましたが、これを達成するには今よりも良い方法があるように感じます。

これがコードです。インポート、実装されていないメソッドなどの不要なコードをいくつか削除しました。

 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 日しかないことを示しているからです。私はアンドロイドのグラフィックスについて何も知りませんでしたが、これに一生懸命取り組みました。

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;
}

}

問題は、日、時間、分、秒を計算するすべてのティックにあります。これが良いかどうか、またはもっと良い方法があるかどうかについて、フィードバックをお寄せください。

4

2 に答える 2

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();
于 2012-10-08T08:28:42.790 に答える
0

intデータ型がミリ秒でオーバーフローしているため、数値が間違っています。an の最大値intは 2^31 ~ 2 x 10^9 です。クリスマスまであと約 155 x 10^9 ミリ秒あります。

秒を計算するだけで大​​丈夫です。longまたは、代わりに64 ビットを使用することもできますint。しかし、1000 を掛けてミリ秒を取得し、すぐに 1000 で割ります! これはあまり意味がありません。

Joda の時間に従ってください。

すでに使用されているので、期間を構築してみませんか?

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);

期間には、年、月、日、時、分、秒のゲッターがあります。これにより、エラーが発生しやすい計算が完全に回避されます。

于 2012-06-20T01:23:14.667 に答える