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