package com.xixun.xixunplayer; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.Choreographer; import android.view.Gravity; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.HashMap; import gnph.android.LinearBox; import gnph.util.Dates; import gnph.util.JSList; import gnph.util.JSMap; import gnph.util.Sys; public class EleDigiClock extends LinearBox implements Choreographer.FrameCallback { static final String weeks[] = {"MON","TUE","WED","THU","FRI","SAT","SUN"}; HashMap imgs = new HashMap<>(); ImageView yearComps[] = {new ImageView(getContext()), new ImageView(getContext()), new ImageView(getContext()), new ImageView(getContext())}; ImageView monthComps[] = {new ImageView(getContext()), new ImageView(getContext())}; ImageView dayComps[] = {new ImageView(getContext()), new ImageView(getContext())}; ImageView weekComp = new ImageView(getContext()), ampmComp = new ImageView(getContext()); ImageView hourComps[] = {new ImageView(getContext()), new ImageView(getContext())}; ImageView minComps[] = {new ImageView(getContext()), new ImageView(getContext())}; ImageView secComps[] = {new ImageView(getContext()), new ImageView(getContext())}; ZoneId timeZone; String timeptn; boolean multiline, weekly, isSingleMonth; public EleDigiClock(String prefix, JSMap json, Context context) { super(context); setGravity(Gravity.CENTER); var aZone = json.str("timeZone"); if(aZone!=null) timeZone = ZoneId.of(aZone); var spaceWidth = json.dbl("spaceWidth"); JSList pics = json.jslist("arrayPics"); for(var pic : pics) imgs.put(pic.stnn("name"), BitmapFactory.decodeFile(prefix+pic.stnn("id"))); int dateStyle = json.intg("dateStyle"); isSingleMonth = dateStyle==1||dateStyle==2||dateStyle==4||dateStyle==6||dateStyle==8||dateStyle==10||dateStyle==12; var timeSep = imgs.get("maohao"); weekly = json.bool("weekly"); var hour12 = json.bool("hour12"); var AmPm = hour12 ? json.bool("AmPm") : false; timeptn = hour12 ? "hhmmssa" : "HHmmss"; var hour = json.bool("hour"); var min = json.bool("min"); var sec = json.bool("sec"); multiline = json.bool("multiline"); addStretch(); if(multiline) { vertical(); var hBox = new LinearBox(this).horizontal(); hBox.addStretch(); addDate(dateStyle, json, hBox); hBox.addStretch(); if(weekly) { hBox = new LinearBox(this).horizontal(); hBox.addStretch(); hBox.addView(weekComp); hBox.addStretch(); } hBox = new LinearBox(this).horizontal(); hBox.addStretch(); if(AmPm) { hBox.addView(ampmComp); hBox.addSpacing((int)spaceWidth); } if(hour) { hBox.addView(hourComps[0]); hBox.addView(hourComps[1]); } if(hour&&min) hBox.addView(newImgView(timeSep)); if(min) { hBox.addView(minComps[0]); hBox.addView(minComps[1]); } if(min&&sec) hBox.addView(newImgView(timeSep)); if(sec) { hBox.addView(secComps[0]); hBox.addView(secComps[1]); } hBox.addStretch(); } else { setOrientation(HORIZONTAL); addDate(dateStyle, json, this); if(getChildCount()>1) addSpacing((int)spaceWidth*2); if(weekly) { addView(weekComp); addSpacing((int)spaceWidth*2); } if(AmPm) { addView(ampmComp); addSpacing((int)spaceWidth); } if(hour) { addView(hourComps[0]); addView(hourComps[1]); } if(hour&&min) addView(newImgView(timeSep)); if(min) { addView(minComps[0]); addView(minComps[1]); } if(min&&sec) addView(newImgView(timeSep)); if(sec) { addView(secComps[0]); addView(secComps[1]); } } addStretch(); } ImageView newImgView(Bitmap img) { var imgv = new ImageView(getContext()); imgv.setImageBitmap(img); return imgv; } void addDate(int dateStyle, JSMap layer, LinearLayout tar) { if(dateStyle==0 || dateStyle==1) { addYear(layer, tar, imgs.get("YEAR")); if(layer.bool("month")) { tar.addView(monthComps[0]); tar.addView(monthComps[1]); tar.addView(newImgView(imgs.get("MONTH"))); } if(layer.bool("day")) { tar.addView(dayComps[0]); tar.addView(dayComps[1]); tar.addView(newImgView(imgs.get("DAY"))); } } else if(dateStyle==2 || dateStyle==3) { var sep = imgs.get("xiegang"); if(layer.bool("month")) { tar.addView(monthComps[0]); tar.addView(monthComps[1]); tar.addView(newImgView(sep)); } if(layer.bool("day")) { tar.addView(dayComps[0]); tar.addView(dayComps[1]); tar.addView(newImgView(sep)); } addYear(layer, tar, null); } else if(dateStyle==4 || dateStyle==5) { var sep = imgs.get("xiegang"); if(layer.bool("day")) { tar.addView(dayComps[0]); tar.addView(dayComps[1]); tar.addView(newImgView(sep)); } if(layer.bool("month")) { tar.addView(monthComps[0]); tar.addView(monthComps[1]); tar.addView(newImgView(sep)); } addYear(layer, tar, null); } else if(dateStyle==6 || dateStyle==7) { var sep = imgs.get("xiegang"); addYear(layer, tar, sep); if(layer.bool("month")) { tar.addView(monthComps[0]); tar.addView(monthComps[1]); tar.addView(newImgView(sep)); } if(layer.bool("day")) { tar.addView(dayComps[0]); tar.addView(dayComps[1]); } } else if(dateStyle==8 || dateStyle==9) { var sep = imgs.get("hengxian"); if(layer.bool("month")) { tar.addView(monthComps[0]); tar.addView(monthComps[1]); tar.addView(newImgView(sep)); } if(layer.bool("day")) { tar.addView(dayComps[0]); tar.addView(dayComps[1]); tar.addView(newImgView(sep)); } addYear(layer, tar, null); } else if(dateStyle==10 || dateStyle==11) { var sep = imgs.get("hengxian"); if(layer.bool("day")) { tar.addView(dayComps[0]); tar.addView(dayComps[1]); tar.addView(newImgView(sep)); } if(layer.bool("month")) { tar.addView(monthComps[0]); tar.addView(monthComps[1]); tar.addView(newImgView(sep)); } addYear(layer, tar, null); } else if(dateStyle==12 || dateStyle==13) { var sep = imgs.get("hengxian"); addYear(layer, tar, sep); if(layer.bool("month")) { tar.addView(monthComps[0]); tar.addView(monthComps[1]); tar.addView(newImgView(sep)); } if(layer.bool("day")) { tar.addView(dayComps[0]); tar.addView(dayComps[1]); } } } void addYear(JSMap layer, LinearLayout tar, Bitmap sep) { if(layer.bool("year")) { if(layer.bool("fullYear")) { tar.addView(yearComps[0]); tar.addView(yearComps[1]); } tar.addView(yearComps[2]); tar.addView(yearComps[3]); if(sep != null) tar.addView(newImgView(sep)); } } void cal() { var dt = timeZone==null ? LocalDateTime.now() : LocalDateTime.now(timeZone); var time = dt.toLocalTime(); var hms = Dates.fmt(time, timeptn); ampmComp.setImageBitmap(imgs.get(time.getHour()<12?"AM":"PM")); hourComps[0].setImageBitmap(imgs.get(hms.substring(0,1))); hourComps[1].setImageBitmap(imgs.get(hms.substring(1,2))); minComps[0].setImageBitmap(imgs.get(hms.substring(2,3))); minComps[1].setImageBitmap(imgs.get(hms.substring(3,4))); secComps[0].setImageBitmap(imgs.get(hms.substring(4,5))); secComps[1].setImageBitmap(imgs.get(hms.substring(5,6))); if(yearComps[0].getDrawable()==null || (time.getHour()==0 && time.getSecond()==0)) { var date = dt.toLocalDate(); if(weekly) weekComp.setImageBitmap(imgs.get(weeks[date.getDayOfWeek().ordinal()])); var ymd = Dates.fmt(date, "yyyyMMdd"); yearComps[0].setImageBitmap(imgs.get(ymd.substring(0,1))); yearComps[1].setImageBitmap(imgs.get(ymd.substring(1,2))); yearComps[2].setImageBitmap(imgs.get(ymd.substring(2,3))); yearComps[3].setImageBitmap(imgs.get(ymd.substring(3,4))); monthComps[0].setImageBitmap(isSingleMonth && ymd.charAt(4)=='0' ? null : imgs.get(ymd.substring(4,5))); monthComps[1].setImageBitmap(imgs.get(ymd.substring(5,6))); dayComps[0].setImageBitmap(isSingleMonth && ymd.charAt(6)=='0' ? null : imgs.get(ymd.substring(6,7))); dayComps[1].setImageBitmap(imgs.get(ymd.substring(7,8))); } } @Override protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if(visibility==View.VISIBLE) { if(lastSec==0) { cal(); choreographer.postFrameCallback(this); } } } Choreographer choreographer = Choreographer.getInstance(); long lastSec = 0; @Override public void doFrame(long frameTimeNanos) { if(! isShown()) { lastSec = 0; return; } var sec = System.currentTimeMillis() / 1000; if(sec != lastSec) { lastSec = sec; cal(); invalidate(); } choreographer.postFrameCallback(this); } }