From ec64ecb9212a71fa4b8874900f66460739c40ecd Mon Sep 17 00:00:00 2001 From: wushunlian Date: Tue, 2 Jul 2019 11:34:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A02=E5=AD=97=E4=BD=93=EF=BC=8C?= =?UTF-8?q?=E5=8F=8A=E6=9B=B4=E5=A4=9A=E8=87=AA=E5=AE=9A=E4=B9=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 10 +- app/src/main/assets/fonts/BONX-TubeBold.ttf | Bin 0 -> 12824 bytes .../assets/fonts/BONX-TubeBoldReverse.ttf | Bin 0 -> 10004 bytes .../clock/socoolby/com/clock/FontManager.java | 8 + .../socoolby/com/clock/MainActivity.java | 39 +- .../com/clock/db/WorkClockDatabase.java | 7 +- .../fragment/AbstractThemeUIFragment.java | 12 +- .../digit/DigitClockConfigFragment.java | 77 +++- .../fragment/digit/DigitClockFragment.java | 6 + .../socoolby/com/clock/model/DateModel.java | 15 +- .../com/clock/model/DigitPerferenceModel.java | 43 +- .../com/clock/model/SharePerferenceModel.java | 28 ++ .../com/clock/state/ClockStateMachine.java | 16 +- .../com/clock/viewmodel/DigitViewModel.java | 35 ++ .../animatorview/animator/SnakeAnimator.java | 6 + .../clock/widget/textview/DigitTextView.java | 420 +++++++++++------- .../main/res/layout/fragment_digit_config.xml | 36 +- 17 files changed, 524 insertions(+), 234 deletions(-) create mode 100644 app/src/main/assets/fonts/BONX-TubeBold.ttf create mode 100644 app/src/main/assets/fonts/BONX-TubeBoldReverse.ttf create mode 100644 app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SnakeAnimator.java diff --git a/app/build.gradle b/app/build.gradle index 76e980b..4e5629c 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -65,15 +65,7 @@ dependencies { // ViewModel and LiveData implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' - implementation('com.gitee.51danju.e-odbo:e-odbo-jdbc:V1.0-beta.3') - { - exclude(group: 'org.apache.logging.log4j', module: '*') - //exclude(group: 'org.apache.logging.log4j', module: 'log4j-core') - //exclude(group: 'org.apache.logging.log4j', module: 'log4j-api') - //exclude(group: 'org.apache.logging.log4j', module: 'log4j-jcl') - //exclude(group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl') - //exclude(group: 'org.slf4j', module: 'slf4j-api') - } + implementation('com.gitee.51danju.e-odbo:e-odbo-jdbc:1.0-beta.13') implementation 'org.slf4j:slf4j-android:1.7.26' //implementation 'com.github.tony19:logback-android-core:1.0.7-1' diff --git a/app/src/main/assets/fonts/BONX-TubeBold.ttf b/app/src/main/assets/fonts/BONX-TubeBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cd3944be0c9a0c369fe59a8f7340fcc2bb8b085f GIT binary patch literal 12824 zcmds7dvIG-dOzo0T}hT~$+9Kcj$c=jBRPJ`k|p^OoERL_;E)(Qail;<99w=QvFzG; zGCTq-4VVz(Hc5G;U0McayE99?K&dfoq06+x&eE2)bh_;@+tN-u9j4RQ>~0w#c7NY} z$gjX|8u^c|lcVoD-+ABr{m%D&=Um1aV|I3iiEN^ycl+(gK@!RZHSg-J4@I{2Hb8U= z`GW&v{S)jzgoBI;$g+k)k6INPjLw(6$lzijlEnr%c}xFdzOS5zW91K_Z2goUP41LN>Wn_QCwm{0*=gKU**!BNW4N*&1 zv{jTqLcLvKM(73owQ40wX4Q|P3aeymvoyxn{Tc8ijLgK$EDKM`%CcDwvoQn1Ge+J_ zj}2T7lUd8+qS6uZLGXO>r;Goz_|fti&M{WgHOI2Lc> z=NPY%y?t<6?vzLR2WJf%6^er7bfR9K zWxerH{O*o>X16Aa(`+)4XhA;)>IY3weL8_24r@JtDx&&ps3g^N$+M!rJAPMu_Do0d z?ADG%vBx8Cn|-%CKKpJ*u_uv0En|A7nDGOnh1#4=n6t48CV*s2NeB+v(*#I`wprW>7s_&miV@OgY5%rnt}v9oHr zdgI$LQ%|Cn;h9&ndAtR@scJs2fCbDuOceb5`_Sso*=4*pbM-rTtA4z@B9@2uOcM4E z<7+AjY?}Qli$jV1YNdH-h{#OU7)X5*5Idn8l}Iz-fm7g`a7rM9?(;W9nOd+rmAT<( zTO3cVzW7aOn$(t{4mlIip)nVQA9Fm-dN4?42n-)0ffqi840$7H*2lqyjSinf^f)~H z_ID`y6iL|MUJTGU@Uk3i6H+tMcBBN-DAH-9 zCy<^+`aPsKk$!-bLk*3rkhzikNKvFtq&}n}q!UQLhIAR}Wu!Nd{sajPCHB`~{uxQw zPfJl}HIL=%T)W22u}&6AMKnjz)hy_eY{(@Qwaz?lroc?r^BUY3DZXa)2-J z`h9^qj+)Ue9JDdo%0q6K(`YIvqZ&p#8u?6)hat-%#{|3W;UrTPKQFa#jd__*#See`6`{Kn7eiWXogg%*9>Jz)0CD~y% z&Ys{eXHc_>G|k$@x)ntj!WaaLB0St|O{?;tRi&CP%`wtFKkyLva7n}F*kMSIp#BhO z3MEf0>7IdYQ@TFH?osGoEQNF~$UF+ohWwDCux%PQ$JzisJBD?m?p~D5F?YS9n{Mc) zTh~oDbkhypbVE1Y&`mdV(+%BpLpR-+f*ZQ&hHko{n{Mc)8!ARiQTrsV(tD3#toHQi zhp>ntEMhc0vm@!6cPk5=V?-xDoMTk?8_I&Wv7j>3AS6$cUV8niu01v~N!8qPsA+hk$K?^*M3e@6CTE#Y;PBaazKxq&q00eR zq)c=YTfo+pI*rfzFVZhHT=slJdP zm^UT4QD_N;T7=ZMd2@2QclVRYSSCU^WFJ92UyGmGphB0d$$jjE zW=&LXxivY+`ZI1#)IQ0Y=)J4fL?8VG7SV%6^kT*|Gb{;`Jy>2pXdE;SYe%*Afxi#* zUeJ3Xqk2Q&sq8UO%1?umg}Jyc7KWR``LSrs7l^>J#9ZOVI(R@~#Y^&e$cDx8BR-=O zPLpEMG(%I$$@-XX*4!-o&&iXPM=avgmS}g@vopoj;lisq4oA+yGdT|F{R^BxCO36e zNm5l;le{4#Cg+b|;emJTHcLuqt4pOyHWlYA-1a?34uQ>V;Tt~{O(IPp(Aik7fR1md zZS_=bypDgC!0R7|_w+npSVz1aRPZ*B;3)Bbz@4f>{ZJu77P&YhY4nYzIo(Fhu>@+J zLG3u`BcPAe&$CNwu{g~76%6(&lUnZC^|N6Oiz>GqiwV}7aV)BR5*GE|RV?bG(}D

?MlXO;`%9pN%HLWSRKn}469T2Y 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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/clock/socoolby/com/clock/FontManager.java b/app/src/main/java/clock/socoolby/com/clock/FontManager.java index 4af890e..46fc259 100644 --- a/app/src/main/java/clock/socoolby/com/clock/FontManager.java +++ b/app/src/main/java/clock/socoolby/com/clock/FontManager.java @@ -111,4 +111,12 @@ public class FontManager { e.printStackTrace(); } } + + public void addCoustomFontStyle(List coustomFontStyleList){ + this.fontStyleList.addAll(coustomFontStyleList); + } + + public void addCoustomFontStyle(TimeFontStyle coustomFontStyleList){ + this.fontStyleList.add(coustomFontStyleList); + } } diff --git a/app/src/main/java/clock/socoolby/com/clock/MainActivity.java b/app/src/main/java/clock/socoolby/com/clock/MainActivity.java index 7b01ed4..5d02fa2 100755 --- a/app/src/main/java/clock/socoolby/com/clock/MainActivity.java +++ b/app/src/main/java/clock/socoolby/com/clock/MainActivity.java @@ -54,7 +54,6 @@ import clock.socoolby.com.clock.protocol.WeatherResponse; import clock.socoolby.com.clock.service.ProximityService; import clock.socoolby.com.clock.state.ClockModeEnum; import clock.socoolby.com.clock.state.ClockStateMachine; -import clock.socoolby.com.clock.state.ClockTimeTypeEnum; import clock.socoolby.com.clock.model.SharePerferenceModel; import clock.socoolby.com.clock.state.ClockInterfaceTypeEnum; import clock.socoolby.com.clock.state.ClockThemeUITypeEnum; @@ -66,30 +65,8 @@ import clock.socoolby.com.clock.viewmodel.ThemeUIViewModel; import clock.socoolby.com.clock.viewmodel.ViewModelFactory; import clock.socoolby.com.clock.widget.animatorview.AnimatorView; import clock.socoolby.com.clock.widget.animatorview.I_Animator; -import clock.socoolby.com.clock.widget.animatorview.animator.AnimatorFactory; -import clock.socoolby.com.clock.widget.animatorview.animator.BubbleAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.BubbleCollisionAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.BubbleWhirlPoolAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.CarrouselAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.DotsLineAnimator; import clock.socoolby.com.clock.widget.animatorview.animator.FishAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.MagicLineAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.PhaserBallAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.SawtoothAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.Wave3DAnimator; import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.ClockFactory; -import clock.socoolby.com.clock.widget.animatorview.animator.textanimator.EZLedAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.FireAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.FireworkAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.FluorescenceAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.RainAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.SkyAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.SnowAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.StarFallAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.VorolayAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.WaterAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.WindmillAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.textanimator.EvaporateTextAnimator; import static clock.socoolby.com.clock.state.ClockThemeUITypeEnum.FULLSCREEN; import static clock.socoolby.com.clock.state.ClockThemeUITypeEnum.SETTING; @@ -97,6 +74,7 @@ import static clock.socoolby.com.clock.state.ClockThemeUITypeEnum.SETTING; public class MainActivity extends AppCompatActivity implements android.view.GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener, GestureDetector.OnDoubleTapListener { private final static String TAG = MainActivity.class.getSimpleName(); + private final static int SETTING_REQUEST_CODE = 100; //背景动画 @@ -104,7 +82,6 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges private I_Animator backGroundAnimator; - private int currectAnimatorIndex=0; private final static int ANIMATOR_TEXTLED=80; @@ -112,7 +89,7 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges //背景图相关 private ImageView tv_background_image; - private String imagePath=null; + // 定义手势检测器实例 GestureDetector detector; @@ -126,8 +103,6 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges public WeatherResponse weatherAdape; - private ClockTimeTypeEnum showTimeType=ClockTimeTypeEnum.TIME; - private ClockStateMachine clockStateMachine; Intent proximityServiceIntent=null; @@ -258,8 +233,6 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges //digitViewModel.getTimeFontStyle().setValue(fontManager.getCurrentFontStyle()); - clockStateMachine.start(); - themeUIManager=new ThemeUIManager(ClockApplication.getInstance().getEntityManager(),model); testSetup(); @@ -298,6 +271,9 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges } catch (BasicException e) { e.printStackTrace(); }*/ + + fontManager.addCoustomFontStyle(new TimeFontStyle("BONX-TubeBold",110,120,130,150)); + fontManager.addCoustomFontStyle(new TimeFontStyle("BONX-TubeBoldReverse",110,120,130,150)); } @@ -471,7 +447,8 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges public void onDestroy() { //Log.i(TAG, "onDestroy...."); super.onDestroy(); - clockStateMachine.onDestory(); + if(clockStateMachine!=null) + clockStateMachine.onDestory(); try { if (model.isTriggerScreen()) stopService(proximityServiceIntent); @@ -494,6 +471,7 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges wakeLock.acquire(); if(backGroundAnimator!=null) backGroundAnimator.start(); + clockStateMachine.start(); } @Override @@ -504,6 +482,7 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges wakeLock.release(); if(backGroundAnimator!=null) backGroundAnimator.stop(); + clockStateMachine.stop(); } public void configBackGroundImage(){ diff --git a/app/src/main/java/clock/socoolby/com/clock/db/WorkClockDatabase.java b/app/src/main/java/clock/socoolby/com/clock/db/WorkClockDatabase.java index 7acea29..f6f76ad 100644 --- a/app/src/main/java/clock/socoolby/com/clock/db/WorkClockDatabase.java +++ b/app/src/main/java/clock/socoolby/com/clock/db/WorkClockDatabase.java @@ -80,9 +80,10 @@ public class WorkClockDatabase extends DataBase { .value("谁能许我扶桑花期", 110, 120, 130, 150) .value("造字工房凌黑", 110, 120, 130, 150) .value("中国龙新草体", 110, 120, 130, 150) - .value("迷你简剪纸_0",110,120,130,150); + .value("迷你简剪纸_0",110,120,130,150) + .value("BONX-TubeBold",110,120,130,150) + .value("BONX-TubeBoldReverse",110,120,130,150) + ; addData(fontStyleInitData); } - - } diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/AbstractThemeUIFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/AbstractThemeUIFragment.java index 1191d03..bc682d6 100644 --- a/app/src/main/java/clock/socoolby/com/clock/fragment/AbstractThemeUIFragment.java +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/AbstractThemeUIFragment.java @@ -93,9 +93,6 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O private Timer timer=null; - private ClockStateMachine clockStateMachine; - - public AbstractThemeUIFragment(int layoutId){ this.layoutId=layoutId; } @@ -110,7 +107,6 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O this.alterViewModel=ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(AlterViewModel.class); this.mainActivity = (MainActivity)getActivity(); this.model = ClockApplication.getInstance().getModel(); - this.clockStateMachine=mainActivity.getClockStateMachine(); } @Override @@ -168,7 +164,7 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O tv_break.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { - clockStateMachine.handUpCountingDownCheck(); + mainActivity.getClockStateMachine().handUpCountingDownCheck(); return true; } }); @@ -341,8 +337,8 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O }else{ tv_handup.setColorFilter(R.color.colorPrimaryDark); tv_hand_time.setVisibility(View.GONE); - if(clockStateMachine.getCurrentShowTimeType()== ClockTimeTypeEnum.COUNTING_DOWN) - clockStateMachine.setCurrentShowTimeType(ClockTimeTypeEnum.TIME); + if(mainActivity.getClockStateMachine().getCurrentShowTimeType()== ClockTimeTypeEnum.COUNTING_DOWN) + mainActivity.getClockStateMachine().setCurrentShowTimeType(ClockTimeTypeEnum.TIME); } } }); @@ -520,7 +516,7 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O globalViewModel.setSrceenLock(!globalViewModel.getSrceenLock().getValue()); break; case R.id.tv_break: - clockStateMachine.countingCheck(); + mainActivity.getClockStateMachine().countingCheck(); break; case R.id.tv_descript: setDiscript(SettingActivity.roundAutoQuotes()); diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockConfigFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockConfigFragment.java index 4134fad..a16e87c 100644 --- a/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockConfigFragment.java +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockConfigFragment.java @@ -13,12 +13,13 @@ import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; -import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProviders; import com.openbravo.data.basic.BasicException; +import java.util.Random; + import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; @@ -46,6 +47,7 @@ public class DigitClockConfigFragment extends Fragment { ThemeUIManager themeUIManager; + @BindView(R.id.tv_hourSystem12) RadioButton tvHourSystem12; @BindView(R.id.tv_hourSystem24) @@ -114,6 +116,14 @@ public class DigitClockConfigFragment extends Fragment { RadioButton tvTextAnimTabDigitUp; @BindView(R.id.tv_theme_config_recover) Button tvThemeConfigRecover; + @BindView(R.id.button_round) + Button buttonRound; + @BindView(R.id.tv_SecondSubscript) + CheckBox tvSecondSubscript; + @BindView(R.id.tv_textStyle_border) + CheckBox tvTextStyleBorder; + @BindView(R.id.tv_textStyle_border_color) + Button tvTextStyleBorderColor; public DigitClockConfigFragment(ThemeUIManager themeUIManager) { this.themeUIManager = themeUIManager; @@ -233,6 +243,17 @@ public class DigitClockConfigFragment extends Fragment { changeGradientColor(button8, 4); }); + buttonRound.setOnClickListener(view1 -> { + for (int i = 0; i < confColors.length; i++) + confColors[i] = roundColor(); + digitViewModel.setTimeLinearGradientColorsArray(confColors); + button4.setBackgroundColor(confColors[0]); + button5.setBackgroundColor(confColors[1]); + button6.setBackgroundColor(confColors[2]); + button7.setBackgroundColor(confColors[3]); + button8.setBackgroundColor(confColors[4]); + }); + tvThemeUIStyle1.setOnClickListener(v -> changeThemeUIStyle(1)); tvThemeUIStyle2.setOnClickListener(v -> changeThemeUIStyle(2)); @@ -258,6 +279,33 @@ public class DigitClockConfigFragment extends Fragment { } }); + tvSecondSubscript.setOnCheckedChangeListener((group, checkedId) -> { + digitViewModel.setSecondSubscript(tvSecondSubscript.isChecked()); + }); + + tvTextStyleBorder.setOnCheckedChangeListener((group, checkedId) -> { + digitViewModel.setCharBackgroundBorder(tvTextStyleBorder.isChecked()); + tvTextStyleBorderColor.setClickable(tvTextStyleBorder.isChecked()); + }); + + tvTextStyleBorderColor.setOnClickListener(v->{ + if (colorPickerDialog == null) + colorPickerDialog = new ColorPickerPop(getActivity()); + + colorPickerDialog.setOnColorChangeListenter(new ColorPickerPop.OnColorListener() { + @Override + public void onEnsure(int color) { + digitViewModel.setCharBackgroundBorderColor(color); + tvTextStyleBorderColor.setBackgroundColor(color); + } + + @Override + public void onBack() { + } + }); + colorPickerDialog.show(digitViewModel.getCharBackgroundBorderColor().getValue()); + }); + return view; } @@ -268,8 +316,8 @@ public class DigitClockConfigFragment extends Fragment { themeUIManager.loadDigitThemeFromDB(styleName); reloadViewModel(); } else { - DialogUtils.show(getActivity(),"温馨提示","当前主题还未设置,是否以当前主题保存.",ok->{ - if(ok) + DialogUtils.show(getActivity(), "温馨提示", "当前主题还未设置,是否以当前主题保存.", ok -> { + if (ok) configThemeUIStyle(order); }); Toast.makeText(getActivity(), "你可长按来保存一个主题", Toast.LENGTH_SHORT).show(); @@ -314,6 +362,7 @@ public class DigitClockConfigFragment extends Fragment { digitViewModel.loadFromModel(); loadForViewModel(); } + /** * onDestroyView中进行解绑操作 */ @@ -393,9 +442,16 @@ public class DigitClockConfigFragment extends Fragment { button6.setClickable(able); button7.setClickable(able); button8.setClickable(able); + buttonRound.setClickable(able); }); setTextColor(globalViewModel.getForegroundColor().getValue()); + + tvSecondSubscript.setChecked(digitViewModel.getSecondSubscript().getValue()); + + tvTextStyleBorder.setChecked(digitViewModel.getCharBackgroundBorder().getValue()); + tvTextStyleBorderColor.setBackgroundColor(digitViewModel.getCharBackgroundBorderColor().getValue()); + tvTextStyleBorderColor.setClickable(digitViewModel.getCharBackgroundBorder().getValue()); } private void setTextColor(int color) { @@ -404,6 +460,7 @@ public class DigitClockConfigFragment extends Fragment { tvHourSystem24.setTextColor(color); tvSecoundShow.setTextColor(color); + tvSecondSubscript.setTextColor(color); textView3.setTextColor(color); @@ -428,10 +485,24 @@ public class DigitClockConfigFragment extends Fragment { button6.setTextColor(color); button7.setTextColor(color); button8.setTextColor(color); + buttonRound.setTextColor(color); tvThemeUIStyle1.setTextColor(color); tvThemeUIStyle2.setTextColor(color); tvThemeUIStyle3.setTextColor(color); tvThemeUIStyle4.setTextColor(color); + + tvTextStyleBorder.setTextColor(color); + tvTextStyleBorderColor.setTextColor(color); + } + + static Random rand = new Random(); + + public static int roundColor() { + int alpha = 200; + int r = rand.nextInt(255); + int g = rand.nextInt(255); + int b = rand.nextInt(255); + return alpha << 24 | r << 16 | g << 8 | b; } } diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockFragment.java index c853a8e..d05309c 100644 --- a/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockFragment.java +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockFragment.java @@ -131,6 +131,12 @@ public class DigitClockFragment extends Fragment { tv_time.setTextColor(integer); } }); + + digitViewModel.getSecondSubscript().observe(this,isSubscript->tv_time.setSecondSubscript(isSubscript)); + + digitViewModel.getCharBackgroundBorder().observe(this,able->tv_time.setCharBackgroundBorder(able)); + + digitViewModel.getCharBackgroundBorderColor().observe(this,color->tv_time.setCharBackgroundBorderColor(color)); } private void updateBaseLine(boolean isFullScreen){ diff --git a/app/src/main/java/clock/socoolby/com/clock/model/DateModel.java b/app/src/main/java/clock/socoolby/com/clock/model/DateModel.java index dc51c61..a63eec2 100755 --- a/app/src/main/java/clock/socoolby/com/clock/model/DateModel.java +++ b/app/src/main/java/clock/socoolby/com/clock/model/DateModel.java @@ -136,10 +136,21 @@ public class DateModel implements Serializable { return String.format("%02d:%02d", hour, minute); } + public String getTimeString(boolean heartbeat,boolean isHourSystem12) { + if(isHourSystem12&&hour>12) + if(heartbeat) + return String.format("%02d:%02d %02d", hour-12, minute, second); + else + return String.format("%02d:%02d:%02d", hour-12, minute, second); + if(heartbeat) + return String.format("%02d:%02d %02d", hour, minute, second); + return String.format("%02d:%02d:%02d", hour, minute, second); + } + public String getTimeString(boolean isHourSystem12) { if(isHourSystem12&&hour>12) - return String.format("%02d:%02d %02d", hour-12, minute, second); - return String.format("%02d:%02d %02d", hour, minute, second); + return String.format("%02d:%02d:%02d", hour-12, minute, second); + return String.format("%02d:%02d:%02d", hour, minute, second); } public static String getNowWithTime() { diff --git a/app/src/main/java/clock/socoolby/com/clock/model/DigitPerferenceModel.java b/app/src/main/java/clock/socoolby/com/clock/model/DigitPerferenceModel.java index 172e4af..e3cdac2 100644 --- a/app/src/main/java/clock/socoolby/com/clock/model/DigitPerferenceModel.java +++ b/app/src/main/java/clock/socoolby/com/clock/model/DigitPerferenceModel.java @@ -1,5 +1,7 @@ package clock.socoolby.com.clock.model; +import android.graphics.Color; + import org.json.JSONException; import org.json.JSONObject; @@ -25,6 +27,15 @@ public class DigitPerferenceModel { protected final static String KEY_IS_DISPLAY_SECOND = "key_is_display_second"; protected boolean displaySecond = true; + protected final static String KEY_IS_DISPLAY_SECOND_SUBSCRIPT = "key_is_display_second_subscript"; + protected boolean timeTextSecondSubscript = true; + + protected final static String KEY_IS_CHAR_BACKGROUND_BORDER = "key_is_char_background_border"; + protected boolean charBackgroundBorder = false; + + protected final static String KEY_IS_CHAR_BACKGROUND_BORDER_COLOR = "key_is_char_background_border_color"; + protected Integer charBackgroundBorderColor=0; + public void fromJsonString(JSONObject jsonObject) throws JSONException { linearGradientAble=jsonObject.optBoolean(KEY_IS_LINEARGRADIENT_ABLE,false); timeColorsArray=stringToIntegerArray(jsonObject.optString(KEY_FOREGROUND_TIME_COLORS_ARRAY,null)); @@ -32,7 +43,10 @@ public class DigitPerferenceModel { shadowType=jsonObject.optInt(KEY_TIME_TEXT_SHADOW_TYPE,0); timeTextCharAnimatorType=jsonObject.optInt(KEY_TIME_TEXT_CHAR_ANIMATOR_TYPE,0); fontName=jsonObject.optString(KEY_FONT_NAME,"default"); - displaySecond = jsonObject.getBoolean(KEY_IS_DISPLAY_SECOND); + displaySecond = jsonObject.optBoolean(KEY_IS_DISPLAY_SECOND,false); + timeTextSecondSubscript=jsonObject.optBoolean(KEY_IS_DISPLAY_SECOND_SUBSCRIPT,true); + charBackgroundBorder=jsonObject.optBoolean(KEY_IS_CHAR_BACKGROUND_BORDER,false); + charBackgroundBorderColor=jsonObject.optInt(KEY_IS_CHAR_BACKGROUND_BORDER_COLOR, Color.BLACK); } @@ -44,6 +58,9 @@ public class DigitPerferenceModel { jsonObject.put(KEY_TIME_TEXT_CHAR_ANIMATOR_TYPE,timeTextCharAnimatorType); jsonObject.put(KEY_FONT_NAME,fontName); jsonObject.put(KEY_IS_DISPLAY_SECOND, displaySecond); + jsonObject.put(KEY_IS_DISPLAY_SECOND_SUBSCRIPT,timeTextSecondSubscript); + jsonObject.put(KEY_IS_CHAR_BACKGROUND_BORDER,charBackgroundBorder); + jsonObject.put(KEY_IS_CHAR_BACKGROUND_BORDER_COLOR,charBackgroundBorderColor); } public static String integerArrayToString(Integer[] fromArrays){ @@ -124,4 +141,28 @@ public class DigitPerferenceModel { public void setFontName(String fontName) { this.fontName = fontName; } + + public boolean isTimeTextSecondSubscript() { + return timeTextSecondSubscript; + } + + public void setTimeTextSecondSubscript(boolean timeTextSecondSubscript) { + this.timeTextSecondSubscript = timeTextSecondSubscript; + } + + public boolean isCharBackgroundBorder() { + return charBackgroundBorder; + } + + public void setCharBackgroundBorder(boolean charBackgroundBorder) { + this.charBackgroundBorder = charBackgroundBorder; + } + + public Integer getCharBackgroundBorderColor() { + return charBackgroundBorderColor; + } + + public void setCharBackgroundBorderColor(Integer charBackgroundBorderColor) { + this.charBackgroundBorderColor = charBackgroundBorderColor; + } } diff --git a/app/src/main/java/clock/socoolby/com/clock/model/SharePerferenceModel.java b/app/src/main/java/clock/socoolby/com/clock/model/SharePerferenceModel.java index 2877fce..8bfeb7a 100755 --- a/app/src/main/java/clock/socoolby/com/clock/model/SharePerferenceModel.java +++ b/app/src/main/java/clock/socoolby/com/clock/model/SharePerferenceModel.java @@ -689,4 +689,32 @@ public class SharePerferenceModel implements Serializable { this.simulatePerferenceModel = simulatePerferenceModel; dirtySave(); } + + public void setTimeTextSecondSubscript(Boolean secondSubscript) { + digitPerferenceModel.setTimeTextSecondSubscript(secondSubscript); + dirtySave(); + } + + public boolean isTimeTextSecondSubscript(){ + return digitPerferenceModel.isTimeTextSecondSubscript(); + } + + public boolean isCharBackgroundBorder() { + return digitPerferenceModel.isCharBackgroundBorder(); + } + + public void setCharBackgroundBorder(boolean charBackgroundBorder) { + digitPerferenceModel.setCharBackgroundBorder(charBackgroundBorder); + dirtySave(); + } + + public Integer getCharBackgroundBorderColor() { + return digitPerferenceModel.getCharBackgroundBorderColor(); + } + + public void setCharBackgroundBorderColor(Integer charBackgroundBorderColor) { + digitPerferenceModel.setCharBackgroundBorderColor(charBackgroundBorderColor); + dirtySave(); + } + } diff --git a/app/src/main/java/clock/socoolby/com/clock/state/ClockStateMachine.java b/app/src/main/java/clock/socoolby/com/clock/state/ClockStateMachine.java index 62ff76c..7594677 100644 --- a/app/src/main/java/clock/socoolby/com/clock/state/ClockStateMachine.java +++ b/app/src/main/java/clock/socoolby/com/clock/state/ClockStateMachine.java @@ -58,12 +58,12 @@ public class ClockStateMachine implements Handler.Callback{ this.alterManager = alterManager; this.alterViewModel=alterViewModel; this.themeUIViewModel=themeUIViewModel; + LunarCalendarManager.init(ClockApplication.getContext()); + model=ClockApplication.getInstance().getModel(); } public void start(){ - LunarCalendarManager.init(ClockApplication.getContext()); - model=ClockApplication.getInstance().getModel(); //Log.d(TAG,"create timer and timerTask................................."); timer = new Timer(); handler = new Handler(this); @@ -79,6 +79,15 @@ public class ClockStateMachine implements Handler.Callback{ timer.schedule(timerTask, 1000, 1000); } + public void stop(){ + if(timer!=null) { + timerTask.cancel(); + timer.cancel(); + timer=null; + } + } + + @Override public boolean handleMessage(Message msg) { switch (msg.what) { @@ -226,7 +235,8 @@ public class ClockStateMachine implements Handler.Callback{ } public void onDestory() { - timer.cancel(); + if(timer!=null) + timer.cancel(); } //handUp diff --git a/app/src/main/java/clock/socoolby/com/clock/viewmodel/DigitViewModel.java b/app/src/main/java/clock/socoolby/com/clock/viewmodel/DigitViewModel.java index 27d55b7..e784847 100644 --- a/app/src/main/java/clock/socoolby/com/clock/viewmodel/DigitViewModel.java +++ b/app/src/main/java/clock/socoolby/com/clock/viewmodel/DigitViewModel.java @@ -32,6 +32,12 @@ public class DigitViewModel extends ViewModel { private MutableLiveData timeFontName =new MutableLiveData<>(); + private MutableLiveData secondSubscript=new MutableLiveData<>();//缩小 + + private MutableLiveData charBackgroundBorder=new MutableLiveData<>(); + + private MutableLiveData charBackgroundBorderColor=new MutableLiveData<>(); + SharePerferenceModel model; public DigitViewModel(SharePerferenceModel model) { @@ -49,6 +55,9 @@ public class DigitViewModel extends ViewModel { baseLineDown.setValue(0); timeFontStyleSize.setValue(100); timeFontName.setValue(model.getFontName()); + secondSubscript.setValue(model.isTimeTextSecondSubscript()); + charBackgroundBorder.setValue(model.isCharBackgroundBorder()); + charBackgroundBorderColor.setValue(model.getCharBackgroundBorderColor()); } public MutableLiveData getDisplaySecond() { @@ -143,4 +152,30 @@ public class DigitViewModel extends ViewModel { return timeFontName; } + public MutableLiveData getSecondSubscript() { + return secondSubscript; + } + + public void setSecondSubscript(Boolean secondSubscript) { + this.secondSubscript.setValue(secondSubscript); + model.setTimeTextSecondSubscript(secondSubscript); + } + + public MutableLiveData getCharBackgroundBorder() { + return charBackgroundBorder; + } + + public void setCharBackgroundBorder(Boolean charBackgroundBorder) { + this.charBackgroundBorder.setValue(charBackgroundBorder); + model.setCharBackgroundBorder(charBackgroundBorder); + } + + public MutableLiveData getCharBackgroundBorderColor() { + return charBackgroundBorderColor; + } + + public void setCharBackgroundBorderColor(Integer charBackgroundBorderColor) { + this.charBackgroundBorderColor.setValue(charBackgroundBorderColor); + model.setCharBackgroundBorderColor(charBackgroundBorderColor); + } } diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SnakeAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SnakeAnimator.java new file mode 100644 index 0000000..311ecad --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SnakeAnimator.java @@ -0,0 +1,6 @@ +package clock.socoolby.com.clock.widget.animatorview.animator; + +public class SnakeAnimator { + + +} diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/textview/DigitTextView.java b/app/src/main/java/clock/socoolby/com/clock/widget/textview/DigitTextView.java index 8d61a79..9c650b1 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/textview/DigitTextView.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/textview/DigitTextView.java @@ -8,12 +8,14 @@ import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Shader; +import android.graphics.Typeface; import android.text.TextPaint; import android.util.AttributeSet; import android.util.Log; import androidx.annotation.Nullable; +import java.util.Date; import java.util.HashMap; import java.util.Random; @@ -25,20 +27,64 @@ import clock.socoolby.com.clock.widget.textview.charanimator.TabDigitCharAnimato import clock.socoolby.com.clock.widget.textview.charanimator.Up2DownCharAnimator; public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { - public static final String Tag=DigitTextView.class.getSimpleName(); + public static final String Tag = DigitTextView.class.getSimpleName(); - float baseLineDown=0; + float baseLineDown = 0; private LinearGradient mLinearGradient; - private boolean isLinearGradientAble=false; + private boolean isLinearGradientAble = false; - private ShadowTypeEnum shadowType=ShadowTypeEnum.NOSETUP;//0:不设置,1:阴影,2:浮雕 + private ShadowTypeEnum shadowType = ShadowTypeEnum.NOSETUP;//0:不设置,1:阴影,2:浮雕 - private int[] linearGradientColors=new int[]{roundColor(), roundColor(), roundColor(), roundColor(), roundColor()}; + private int[] linearGradientColors; + private CharSequence preString = ""; - private CharSequence preString=null; + private boolean secondSubscript = false; + + private boolean charBackgroundBorder = false; + + private int charBackgroundBorderColor = Color.BLACK; + + private int textWidth = 0; + private int textHight; + private int textfontHight; + private int baseCharWidth; + private int flagCharwidth; + private int smallTextHight; + private int smallCharWidth; + private int textLength; + private int textSmallSpan; + private HashMap charAnimatorHashMap = new HashMap<>(); + + private CharAnimatorEnum currentCharAnimatorType = CharAnimatorEnum.Marquee3D_Up; + + AbstractCharAnimator charAnimator; + + float startX, startY; + + Paint smallCharPaint = null; + + Paint mTextPaint; + + float fontScale; + + String charStr; + + float centerY; + + CharSequence textToDraw; + + Paint.FontMetricsInt fm; + + int padding = 2; + + int charWidth; + + Paint mDividerPaint, mBackgroundPaint; + + boolean layoutReflushAble=true; public DigitTextView(Context context) { super(context); @@ -55,9 +101,8 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { init(); } - - private void init(){ - /*mDividerPaint = new Paint(); + private void init() { + mDividerPaint = new Paint(); mDividerPaint.setAntiAlias(true); mDividerPaint.setStyle(Paint.Style.FILL_AND_STROKE); mDividerPaint.setColor(Color.WHITE); @@ -65,73 +110,62 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { mBackgroundPaint = new Paint(); mBackgroundPaint.setAntiAlias(true); - mBackgroundPaint.setColor(Color.BLACK);*/ } - - public void setBaseLineDown(float baseLineDown) { this.baseLineDown = baseLineDown; + layoutReflushAble=true; } - float[] pos = {0.1f,0.3f,0.5f,0.7f,0.9f}; + float[] pos = {0.1f, 0.3f, 0.5f, 0.7f, 0.9f}; - boolean isLinearGradientPosAble=false; + boolean isLinearGradientPosAble = false; - boolean isReflectedAble=false; + boolean isReflectedAble = false; - boolean linearGradientReCreate=false; + boolean linearGradientReCreate = false; - public void setLinearGradientRandom(boolean able){ - if(able){ - linearGradientColors= new int[]{roundColor(), roundColor(), roundColor(), roundColor(), roundColor()}; - isLinearGradientPosAble=rand.nextBoolean(); - isReflectedAble=rand.nextBoolean(); - } - setLinearGradientAble(able); - setShadowType(ShadowTypeEnum.valueOf(rand.nextInt(3))); + + public void setLinearGradientAble(boolean able) { + isLinearGradientAble = able; + linearGradientReCreate = true; } - public void setLinearGradientAble(boolean able){ - isLinearGradientAble=able; - linearGradientReCreate=true; + public void setLinearGradient(int[] colors) { + this.linearGradientColors = colors; + linearGradientReCreate = true; } - public void setLinearGradient(int[] colors){ - this.linearGradientColors=colors; - linearGradientReCreate=true; - } - - private void checkReCreate(){ + private void linearGradientReflush() { mLinearGradient = null; - if(isLinearGradientAble&&linearGradientColors!=null) { + if (isLinearGradientAble && linearGradientColors != null) { mLinearGradient = new LinearGradient(0, 0, getWidth(), getHeight(), linearGradientColors, pos, Shader.TileMode.CLAMP); } getPaint().setShader(mLinearGradient); - linearGradientReCreate=false; + linearGradientReCreate = false; } - public void setShadowType(ShadowTypeEnum shadowType){ - this.shadowType=shadowType; - switch (shadowType){ + public void setShadowType(ShadowTypeEnum shadowType) { + this.shadowType = shadowType; + switch (shadowType) { case SHADOW://阴影效果 setShadowLayer(4, 10, 10, Color.BLACK); break; case RELIEF: //setShadowLayer(1, 0.5f, 0.5f, Color.argb(200,204,204,204));//浮雕效果 - setShadowLayer(12, 0, 1,Color.parseColor("#CC2b88f6"));//边缘模糊 + setShadowLayer(12, 0, 1, Color.parseColor("#CC2b88f6"));//边缘模糊 break; default: - setShadowLayer(0,0,0,getPaint().getColor()); + setShadowLayer(0, 0, 0, getPaint().getColor()); } } - public ShadowTypeEnum getShadowType(){ + public ShadowTypeEnum getShadowType() { return shadowType; } - public boolean isLinearGradientAble(){ + public boolean isLinearGradientAble() { return isLinearGradientAble; } @@ -167,154 +201,180 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { isReflectedAble = reflectedAble; } - private int textWidth=0; - private int textHight; - private int textfontHight; - private int baseCharWidth; - private int flagCharwidth; - private int smallTextHight; - private int smallCharWidth; - private int textLength; - private int textSmallSpan; - private HashMap charAnimatorHashMap=new HashMap<>(); + public boolean isSecondSubscript() { + return secondSubscript; + } - private CharAnimatorEnum currentCharAnimatorType= CharAnimatorEnum.Marquee3D_Up; + public void setSecondSubscript(boolean secondSubscript) { + this.secondSubscript = secondSubscript; + layoutReflushAble=true; + } - AbstractCharAnimator charAnimator; + @Override + public void setTextSize(float size) { + super.setTextSize(size); + layoutReflushAble=true; + } - float startX,startY; + @Override + public void setTypeface(@Nullable Typeface tf, int style) { + super.setTypeface(tf, style); + layoutReflushAble=true; + } - Paint smallCharPaint=null; + private void layoutReflush(CharSequence textToDraw){ + fm = mTextPaint.getFontMetricsInt(); - Paint mTextPaint; + baseCharWidth = getCharWidth("8", mTextPaint); + padding = baseCharWidth / 20; + //baseCharWidth+=padding; - float fontScale; + flagCharwidth = getCharWidth(":", mTextPaint); + textfontHight = (int) getFontHeight(mTextPaint); + textHight = -fm.descent - fm.ascent; - String charStr; + smallTextHight = textHight; + smallCharWidth = baseCharWidth; - float centerY; + textLength = textToDraw.length(); + textSmallSpan = 0; - CharSequence textToDraw; + if (textLength > 4) { + textWidth = (baseCharWidth + padding) * 4 + flagCharwidth; + } - Paint.FontMetricsInt fm; + if (textLength > 7) { + if (secondSubscript) { + fontScale = getResources().getDisplayMetrics().scaledDensity; + smallCharPaint = getCustomTextPaint(mTextPaint, mTextPaint.getTextSize() / fontScale * 4 / 5); + smallCharWidth = getCharWidth("8", smallCharPaint); + fm = smallCharPaint.getFontMetricsInt(); + smallTextHight = -fm.descent - fm.ascent; + } else + textSmallSpan = textSmallSpan + flagCharwidth; + textSmallSpan = textSmallSpan + smallCharWidth * 2; + } + + layoutReflushAble=false; + } + + private boolean layoutReflushCheck(CharSequence textToDraw){ + if(layoutReflushAble||textToDraw.length()!=preString.length()) + return true; + return false; + } - int padding=2; protected void onDraw(Canvas canvas) { - - mTextPaint=getPaint(); + //long before=System.currentTimeMillis(); + mTextPaint = getPaint(); mTextPaint.setColor(getCurrentTextColor()); - textToDraw=getText(); + textToDraw = getText(); - fm=mTextPaint.getFontMetricsInt(); + if(layoutReflushCheck(textToDraw)) + layoutReflush(textToDraw); - baseCharWidth= getCharWidth("8",mTextPaint); - padding=baseCharWidth/20; - //baseCharWidth+=padding; + startX = (getWidth() - textWidth - textSmallSpan) / 2; + startY = (getHeight() + textHight) / 2; - flagCharwidth=getCharWidth(":",mTextPaint); - textfontHight=(int)getFontHeight(mTextPaint); - textHight=-fm.descent - fm.ascent; + if (linearGradientReCreate) + linearGradientReflush(); - smallTextHight=0; - smallCharWidth=0; - - textLength=textToDraw.length(); - textSmallSpan=0; - - if(textLength>4){ - textWidth=(baseCharWidth+padding)*4+flagCharwidth; - } - - if(textLength>7){ - fontScale = getResources().getDisplayMetrics().scaledDensity; - smallCharPaint = getCustomTextPaint(mTextPaint,mTextPaint.getTextSize()/fontScale*4/5); - smallCharWidth=getCharWidth("8",smallCharPaint); - fm=smallCharPaint.getFontMetricsInt(); - smallTextHight=-fm.descent - fm.ascent; - textSmallSpan=smallCharWidth*2; - } - - startX=(getWidth()-textWidth-textSmallSpan)/2; - startY=(getHeight()+textHight)/2; - - if(linearGradientReCreate) - checkReCreate(); - - for(int i=0;i + +