package com.xixun.xixunplayer; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.Choreographer; import android.view.View; import android.webkit.WebView; import androidx.annotation.NonNull; import java.util.ArrayList; import java.util.HashMap; import gnph.util.Dates; import gnph.util.JSMap; import gnph.util.NumFmts; public class SrcCountdown extends WebView implements Choreographer.FrameCallback { long targetTime; String html; boolean hasDay, hasHour, hasMin, hasSec; public SrcCountdown(Context context, JSMap json) { super(context); try { html = json.stnn("html"); targetTime = Dates.milli(json.stnn("time")) / 1000; hasDay = html.contains("%d"); hasHour = html.contains("%h"); hasMin = html.contains("%m"); hasSec = html.contains("%s"); } catch (Exception e) { Util.printStackTrace(e); Util.makeText(context, Util.toStr(e)).show(); } } void cal() { var cur = System.currentTimeMillis() / 1000; var secs = targetTime - cur; if(secs < 0) secs = 0; var htm = html; if(hasDay) { var str = Long.toString(secs/86400); secs %= 86400; htm = htm.replace("%d", str); } if(hasHour) { var str = NumFmts.zz().format(secs/3600); secs %= 3600; htm = htm.replace("%h", str); } if(hasMin) { var str = NumFmts.zz().format(secs/60); secs %= 60; htm = htm.replace("%m", str); } if(hasSec) { var str = NumFmts.zz().format(secs); htm = htm.replace("%s", str); } loadData(htm, "text/html", null); } @Override protected void onVisibilityChanged(@NonNull View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if(visibility==View.VISIBLE) { if(lastSec==0) { cal(); choreographer.postFrameCallback(this); lastSec = 1; } } } Choreographer choreographer = Choreographer.getInstance(); long lastSec; @Override public void doFrame(long frameTimeNanos) { if(! isShown()) { lastSec = 0; return; } var sec = System.currentTimeMillis() / 1000; if(sec != lastSec) { lastSec = sec; cal(); } choreographer.postFrameCallback(this); } }