1
0
mirror of https://gitee.com/51danju/workclock.git synced 2025-06-07 19:34:05 +08:00

时间显示增加霓虹灯、阴影效果。

This commit is contained in:
wushunlian 2019-03-11 16:21:54 +08:00
parent 281792e7e7
commit f60a3bf079
5 changed files with 301 additions and 6 deletions

View File

@ -1,5 +1,5 @@
# WorkClock # WorkClock
An Android clock An Android clock [下载](#直接下载)
<img src="/screenshot/demo.gif" width="768" height="382"/> <img src="/screenshot/demo.gif" width="768" height="382"/>
@ -95,8 +95,13 @@ An Android clock
### 移除应用: ### 移除应用:
设置->Uninstall 设置->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) SourceCode:[WorkClock](https://gitee.com/51danju/workclock)

View File

@ -1604,6 +1604,10 @@ public class MainActivity extends Activity implements Handler.Callback, View.OnC
@Override @Override
public boolean onDoubleTap(MotionEvent e) { public boolean onDoubleTap(MotionEvent e) {
if(!isArtificialHiddle) {
tv_time.setLinearGradientRandom(!tv_time.isLinearGradientAble());
return true;
}
return false; return false;
} }

View File

@ -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<ScrollingImageAnimator.ScrollingImage> {
public ScrollingImageAnimator() {
super(DYNAMIC_QUANTITY);
}
public void addResourceIds(int[] resourceIds,int speed,boolean randStartX){
for(int i=0;i<resourceIds.length;i++)
list.add(new ScrollingImage(speed,resourceIds[i],rand.nextInt(width),rand.nextInt(height),randStartX));
}
public void addBackgroundResourceId(int resourceId,int left,int top){
list.add(new ScrollingImage(0,resourceId,left,top,false));
}
@Override
public ScrollingImage createNewEntry() {
return null;
}
public class ScrollingImage implements I_AnimatorEntry {
private Bitmap bitmap;
private float speed;
private float offset;
private boolean isStarted;
int resourceID;
private int startX,startY;
boolean randStartX;
public ScrollingImage(float speed,int resourceID,int startX,int startY,boolean randStartX) {
this.speed = speed;
this.resourceID=resourceID;
this.startX=startX;
offset=startX;
this.startY=startY;
this.randStartX=randStartX;
init();
}
private void init(){
bitmap = loadBitmap(mainView.getContext(), resourceID);
}
/**
* Start the animation
*/
public void start() {
if (!isStarted) {
isStarted = true;
}
}
/**
* Stop the animation
*/
public void stop() {
if (isStarted) {
isStarted = false;
}
}
public void setSpeed(float speed) {
this.speed = speed;
}
@Override
public void move(int maxWidth, int maxHight) {
if (isStarted && speed != 0) {
offset -= Math.abs(speed);
if(offset<-bitmap.getWidth()) {
offset = width;
if(randStartX) {
offset = rand.nextInt(width);
}
}
}
}
@Override
public void onDraw(Canvas canvas, Paint mPaint) {
canvas.drawBitmap(bitmap, offset, startY, null);
}
}
public static Bitmap loadBitmap(Context context, int resourceId) {
return BitmapFactory.decodeResource(context.getResources(), resourceId);
}
}

View File

@ -0,0 +1,92 @@
package clock.socoolby.com.clock.widget.animatorview.animator.view;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.Shader;
import clock.socoolby.com.clock.widget.animatorview.AbstractAnimator;
import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry;
//参考https://www.jianshu.com/p/0dda922897cf
public class LightningAnimator extends AbstractAnimator<LightningAnimator.Lightning> {
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;
// 改变每次动画的平移xy值范围是[-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);
}
}
}
}

View File

@ -2,18 +2,33 @@ package clock.socoolby.com.clock.widget.textview;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Shader;
import android.text.TextPaint; import android.text.TextPaint;
import android.text.style.ReplacementSpan; import android.text.style.ReplacementSpan;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import java.util.Random;
public class DigitTextView extends android.support.v7.widget.AppCompatTextView { public class DigitTextView extends android.support.v7.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 int shadowType=0;//0:不设置1阴影2:浮雕
private int[] linearGradientColors;
int textWidth=0;
public DigitTextView(Context context) { public DigitTextView(Context context) {
super(context); super(context);
} }
@ -30,6 +45,76 @@ public class DigitTextView extends android.support.v7.widget.AppCompatTextView {
this.baseLineDown = baseLineDown; 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) { protected void onDraw(Canvas canvas) {
int color = getCurrentTextColor(); int color = getCurrentTextColor();
@ -49,13 +134,12 @@ public class DigitTextView extends android.support.v7.widget.AppCompatTextView {
Paint smallCharPaint=null; Paint smallCharPaint=null;
int textLength=textToDraw.length(); int textLength=textToDraw.length();
int textWidth=0;
int textSmallSpan=0; int textSmallSpan=0;
if(textLength>4){ if(textLength>4){
textWidth=baseCharWidth*4+flagCharwidth; textWidth=baseCharWidth*4+flagCharwidth;
} }
if(textLength>7){ if(textLength>7){
float fontScale = getResources().getDisplayMetrics().scaledDensity; float fontScale = getResources().getDisplayMetrics().scaledDensity;
smallCharPaint = getCustomTextPaint(mTextPaint,mTextPaint.getTextSize()/fontScale*4/5); 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<textLength;i++){ for(int i=0;i<textLength;i++){
String c=String.valueOf(textToDraw.charAt(i)); String c=String.valueOf(textToDraw.charAt(i));
int charWidth= getCharWidth("8",mTextPaint);
if(i<5){ if(i<5){
if(i==2){ if(i==2){
canvas.drawText(c, startX, startY+baseLineDown, mTextPaint); canvas.drawText(c, startX, startY+baseLineDown, mTextPaint);
startX+=flagCharwidth; startX+=flagCharwidth;
}else{ }else{
int charWidth= getCharWidth(c,mTextPaint);
canvas.drawText(c, startX+(baseCharWidth-charWidth)/2, startY+baseLineDown, mTextPaint); canvas.drawText(c, startX+(baseCharWidth-charWidth)/2, startY+baseLineDown, mTextPaint);
startX+=baseCharWidth; startX+=baseCharWidth;
} }
@ -86,7 +170,7 @@ public class DigitTextView extends android.support.v7.widget.AppCompatTextView {
centerY=centerY+(startY-centerY)/2+smallCharPaint.getFontMetrics().descent; centerY=centerY+(startY-centerY)/2+smallCharPaint.getFontMetrics().descent;
canvas.drawText(c, startX, centerY+baseLineDown, smallCharPaint); canvas.drawText(c, startX, centerY+baseLineDown, smallCharPaint);
startX+=smallCharWidth; startX+=smallCharWidth;
Log.d(Tag,"view hight:"+getHeight()+"\t startY:"+startY+"\t text hight:"+textHight+"small text hight:"+smallTextHight); //Log.d(Tag,"view hight:"+getHeight()+"\t startY:"+startY+"\t text hight:"+textHight+"small text hight:"+smallTextHight);
} }
} }
} }
@ -249,6 +333,14 @@ public class DigitTextView extends android.support.v7.widget.AppCompatTextView {
} }
} }
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;
}
private static int getCharWidth(String str, Paint paint){ private static int getCharWidth(String str, Paint paint){
return (int)paint.measureText(str); return (int)paint.measureText(str);