diff --git a/README.md b/README.md
index 3c52d4b..8175180 100755
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
# WorkClock
-An Android clock
+An Android clock [下载](#直接下载)
@@ -95,8 +95,13 @@ An Android clock
### 移除应用:
设置->Uninstall
+### 直接下载:
-[Download APK](https://gitee.com/51danju/workclock/raw/master/workclock.apk)
+ [城通网盘](https://u19673462.ctfile.com/fs/19673462-349106916)
+
+ [百度网盘](https://pan.baidu.com/s/1jad6sI6rFAv0Yt-LJ4s6Lg) 提取码: gxsy
+
+ [Download APK](https://gitee.com/51danju/workclock/raw/master/workclock.apk)
SourceCode:[WorkClock](https://gitee.com/51danju/workclock)
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 3caa353..d0377db 100755
--- a/app/src/main/java/clock/socoolby/com/clock/MainActivity.java
+++ b/app/src/main/java/clock/socoolby/com/clock/MainActivity.java
@@ -1604,6 +1604,10 @@ public class MainActivity extends Activity implements Handler.Callback, View.OnC
@Override
public boolean onDoubleTap(MotionEvent e) {
+ if(!isArtificialHiddle) {
+ tv_time.setLinearGradientRandom(!tv_time.isLinearGradientAble());
+ return true;
+ }
return false;
}
diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/ScrollingImageAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/ScrollingImageAnimator.java
new file mode 100644
index 0000000..6dbf139
--- /dev/null
+++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/ScrollingImageAnimator.java
@@ -0,0 +1,102 @@
+package clock.socoolby.com.clock.widget.animatorview.animator;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import clock.socoolby.com.clock.widget.animatorview.AbstractAnimator;
+import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry;
+
+
+//参考自:https://github.com/Q42/AndroidScrollingImageView
+public class ScrollingImageAnimator extends AbstractAnimator {
+
+ public ScrollingImageAnimator() {
+ super(DYNAMIC_QUANTITY);
+ }
+
+ public void addResourceIds(int[] resourceIds,int speed,boolean randStartX){
+ for(int i=0;i {
+
+ public LightningAnimator(int entryQuantity) {
+ super(entryQuantity);
+ }
+
+ public LightningAnimator() {
+ super(1);
+ }
+
+ @Override
+ public Lightning createNewEntry() {
+ return new Lightning(0,0,width,height);
+ }
+
+ public class Lightning implements I_AnimatorEntry {
+ private Shader mGradient;
+ private Matrix mGradientMatrix;
+ private Paint mPaint1;
+ private int mViewWidth = 0, mViewHeight = 0;
+ private float mTranslateX = 0, mTranslateY = 0;
+ private boolean mAnimating = true;
+ private Rect rect;
+
+ public Lightning(int left,int top,int mViewWidth,int mViewHeight) {
+ this.mViewWidth = mViewWidth;
+ this.mViewHeight = mViewHeight;
+ rect.set(left, top, mViewWidth, mViewHeight);
+ init();
+ }
+
+ private void init() {
+ rect = new Rect();
+ mPaint1 = new Paint();
+
+ if (mViewWidth > 0) {
+ //亮光闪过
+ mGradient = new LinearGradient(0, 0, mViewWidth / 2, mViewHeight,
+ new int[]{0x00ffffff, 0x73ffffff, 0x00ffffff, 0x99ffffff, 0x00ffffff},
+ new float[]{0.2f, 0.35f, 0.5f, 0.7f, 1},
+ Shader.TileMode.CLAMP);
+ mPaint1.setShader(mGradient);
+ mPaint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN));
+ mGradientMatrix = new Matrix();
+ mGradientMatrix.setTranslate(-2 * mViewWidth, mViewHeight);
+ mGradient.setLocalMatrix(mGradientMatrix);
+ }
+ }
+
+ float step =0;//0-1
+
+ @Override
+ public void move(int maxWidth, int maxHight) {
+ step = step +0.1f;
+ if(step >1)
+ step =0;
+ //❶ 改变每次动画的平移x、y值,范围是[-2mViewWidth, 2mViewWidth]
+ mTranslateX = 4 * mViewWidth * step - mViewWidth * 2;
+ mTranslateY = mViewHeight * step;
+ //❷ 平移matrix, 设置平移量
+ if (mGradientMatrix != null) {
+ mGradientMatrix.setTranslate(mTranslateX, mTranslateY);
+ }
+ //❸ 设置线性变化的matrix
+ if (mGradient != null) {
+ mGradient.setLocalMatrix(mGradientMatrix);
+ }
+ }
+
+ @Override
+ public void onDraw(Canvas canvas, Paint mPaint) {
+ if (mAnimating && mGradientMatrix != null) {
+ canvas.drawRect(rect, mPaint1);
+ }
+ }
+ }
+}
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 fb0566c..6bf03a8 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
@@ -2,18 +2,33 @@ package clock.socoolby.com.clock.widget.textview;
import android.content.Context;
import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.LinearGradient;
import android.graphics.Paint;
+import android.graphics.Shader;
import android.text.TextPaint;
import android.text.style.ReplacementSpan;
import android.util.AttributeSet;
import android.util.Log;
import androidx.annotation.Nullable;
+import java.util.Random;
+
public class DigitTextView extends android.support.v7.widget.AppCompatTextView {
public static final String Tag=DigitTextView.class.getSimpleName();
float baseLineDown=0;
+ private LinearGradient mLinearGradient;
+
+ private boolean isLinearGradientAble=false;
+
+ private int shadowType=0;//0:不设置,1:阴影,2:浮雕
+
+ private int[] linearGradientColors;
+
+ int textWidth=0;
+
public DigitTextView(Context context) {
super(context);
}
@@ -30,6 +45,76 @@ public class DigitTextView extends android.support.v7.widget.AppCompatTextView {
this.baseLineDown = baseLineDown;
}
+ float[] pos = {0f,0.2f,0.4f,0.5f,0.6f,0.8f,1.0f};
+
+ boolean isLinearGradientPosAble=false;
+
+ public void setLinearGradientRandom(boolean able){
+ if(able){
+ linearGradientColors= new int[]{roundColor(), roundColor(), roundColor(), roundColor(), roundColor(), roundColor(), roundColor()};
+ isLinearGradientPosAble=rand.nextBoolean();
+ }
+ setLinearGradientAble(able);
+ setShadowType(rand.nextInt(3));
+ }
+
+ public void setLinearGradientAble(boolean able){
+ isLinearGradientAble=able;
+ Paint mTextPaint=getPaint();
+ if(isLinearGradientAble){
+ setLinearGradient(linearGradientColors);
+ }else{
+ mTextPaint.setShader(null);
+ }
+ }
+
+ public void setLinearGradient(int[] colors){
+ Paint mTextPaint=getPaint();
+ if(isLinearGradientPosAble&&colors.length==pos.length)
+ mLinearGradient = new LinearGradient(0, 0, getWidth(), getHeight(), colors , pos, Shader.TileMode.CLAMP);
+ else
+ mLinearGradient = new LinearGradient(0, 0, getWidth(), 0,colors, null, Shader.TileMode.CLAMP);
+ mTextPaint.setShader(mLinearGradient);
+ }
+
+ public void setShadowType(int shadowType){
+ this.shadowType=shadowType;
+ switch (shadowType){
+ case 1://阴影效果
+ setShadowLayer(4, 10, 10, Color.BLACK);
+ break;
+ case 2://浮雕效果
+ setShadowLayer(1, 0.5f, 0.5f, Color.argb(200,204,204,204));
+ break;
+ default:
+ setShadowLayer(0,0,0,getPaint().getColor());
+ }
+ }
+
+ public int getShadowType(){
+ return shadowType;
+ }
+
+ public boolean isLinearGradientAble(){
+ return isLinearGradientAble;
+ }
+
+ public boolean isLinearGradientPosAble() {
+ return isLinearGradientPosAble;
+ }
+
+ public int[] getLinearGradientColors() {
+ return linearGradientColors;
+ }
+
+ public void setLinearGradientPosAble(boolean linearGradientPosAble) {
+ isLinearGradientPosAble = linearGradientPosAble;
+ }
+
+ public void setLinearGradientColors(int[] linearGradientColors) {
+ this.linearGradientColors = linearGradientColors;
+ }
+
protected void onDraw(Canvas canvas) {
int color = getCurrentTextColor();
@@ -49,13 +134,12 @@ public class DigitTextView extends android.support.v7.widget.AppCompatTextView {
Paint smallCharPaint=null;
int textLength=textToDraw.length();
- int textWidth=0;
int textSmallSpan=0;
-
if(textLength>4){
textWidth=baseCharWidth*4+flagCharwidth;
}
+
if(textLength>7){
float fontScale = getResources().getDisplayMetrics().scaledDensity;
smallCharPaint = getCustomTextPaint(mTextPaint,mTextPaint.getTextSize()/fontScale*4/5);
@@ -70,12 +154,12 @@ public class DigitTextView extends android.support.v7.widget.AppCompatTextView {
for(int i=0;i