diff --git a/README.md b/README.md index 71853f6..fecafdc 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,18 @@ +## 2018-06-11 +将`baseutil`、`fileprovider24`、`flinglistview`、`popupwindow`、`upversion`上传JCenter,并将当前项目中的依赖库删除,改为依赖JCenter上的库,详情浏览[app/build.gradle](app/build.gradle) + +## 2018-06-08 +自定义Gradle插件内容移动到独立的仓库:`CustomGradle`,需要的同学可以自行前往现在,并参考TeachCourse文章《*Android Studio集成greenDAO 3.0基础教程*》 + +## 2018-06-07 +删除非封装库项目:`app-clock`、`app-greendao`、`app-obfuscated`、`app-reboot`、`app-scancode`、`app-uploadpic`、`red-packet-plug`、`screenadapter`,并新建分支`thin-master`管理,推荐下载该分支,后期也主要维护`thin-master`分支 + ## 2018-04-01 因为每次升级buildTool或compileSdk后,创建module时默认使用最新的,造成在当前项目中出现多个buildTool版本和多个compileSdk版本 这样,下载该项目的朋友,编译时同时需要下载多个buildTool版本和多个compileSdk版本,非常不友好且浪费硬盘空间 -因此,在项目根目录`build.gradle`[文件](/build.gradle)添加module的全局变量:`compileSdk`、`buildTools`、`appCompat`、`recyclerView`等,方便统一管理 +因此,在项目根目录[build.gradle](/build.gradle)文件添加module的全局变量:`compileSdk`、`buildTools`、`appCompat`、`recyclerView`等,方便统一管理 在module中引用 [module引用例子](app/build.gradle) diff --git a/app-clock/.gitignore b/app-clock/.gitignore deleted file mode 100644 index a7c0094..0000000 --- a/app-clock/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -## 忽略指定文件夹 -/build - -## 忽略(符合正则规则)的文件 -*.iml -*.apk -*.jks - -## 忽略指定的文件 \ No newline at end of file diff --git a/app-clock/build.gradle b/app-clock/build.gradle deleted file mode 100644 index 6593a7f..0000000 --- a/app-clock/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion rootProject.ext.compileSdk - buildToolsVersion rootProject.ext.buildTools - - defaultConfig { - minSdkVersion 11 - targetSdkVersion 24 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { - exclude group: 'com.android.support', module: 'support-annotations' - }) - compile "com.android.support:appcompat-v7:$rootProject.ext.appCompat" - testCompile 'junit:junit:4.12' -} diff --git a/app-clock/proguard-rules.pro b/app-clock/proguard-rules.pro deleted file mode 100644 index c1b8d5f..0000000 --- a/app-clock/proguard-rules.pro +++ /dev/null @@ -1,25 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in E:\sinolvc\adt-bundle-windows-x86_64-20140702\sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/app-clock/src/androidTest/java/cn/teachcourse/mylibrary/ExampleInstrumentedTest.java b/app-clock/src/androidTest/java/cn/teachcourse/mylibrary/ExampleInstrumentedTest.java deleted file mode 100644 index 07f0fb3..0000000 --- a/app-clock/src/androidTest/java/cn/teachcourse/mylibrary/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.teachcourse.mylibrary; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumentation test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() throws Exception { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("cn.teachcourse.mylibrary.test", appContext.getPackageName()); - } -} diff --git a/app-clock/src/main/AndroidManifest.xml b/app-clock/src/main/AndroidManifest.xml deleted file mode 100644 index ba77bfb..0000000 --- a/app-clock/src/main/AndroidManifest.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app-clock/src/main/java/cn/teachcourse/UnitConvertUtil.java b/app-clock/src/main/java/cn/teachcourse/UnitConvertUtil.java deleted file mode 100644 index fa484d3..0000000 --- a/app-clock/src/main/java/cn/teachcourse/UnitConvertUtil.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.teachcourse; - -import android.content.Context; -import android.content.res.Resources; -import android.util.TypedValue; - -/** - * Created by http://teachcourse.cn on 2017/7/5. - */ - -public class UnitConvertUtil { - public static float getDpVal(Context context,float dp) { - Resources res = context.getResources(); - if (res != null) - return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, res.getDisplayMetrics()); - return dp; - } - - public static float getSpVal(Context context,float sp) { - Resources res = context.getResources(); - if (res != null) - return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, res.getDisplayMetrics()); - return sp; - } -} diff --git a/app-clock/src/main/java/cn/teachcourse/builder/Builder.java b/app-clock/src/main/java/cn/teachcourse/builder/Builder.java deleted file mode 100644 index 2f0b179..0000000 --- a/app-clock/src/main/java/cn/teachcourse/builder/Builder.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.teachcourse.builder; -/** - * Created by postmaster@teachcourse.cn on 2017/4/23. - */ - -public abstract class Builder { - - public abstract Builder setRadius(float radius) ; - - public abstract void setBackgroundExterColor(int backgroundExterColor) ; - - public abstract Builder setTextSize(float textSize) ; - - public abstract Builder setHourWidth(float hourWidth) ; - - public abstract Builder setMinuteWidth(float minuteWidth) ; - - public abstract Builder setSecondWidth(float secondWidth) ; - - public abstract Builder setLongScaleColor(int longScaleColor) ; - - public abstract Builder setShortScaleColor(int shortScaleColor) ; - - public abstract Builder setHourColor(int hourColor) ; - - public abstract Builder setMinuteColor(int minuteColor) ; - - public abstract Builder setSecondColor(int secondColor) ; - - public abstract Builder setBackgroundColor(int backgroundColor) ; - - public abstract Builder setPadding(float padding) ; - - - public abstract WatchViewImpl create() ; -} diff --git a/app-clock/src/main/java/cn/teachcourse/builder/WatchView.java b/app-clock/src/main/java/cn/teachcourse/builder/WatchView.java deleted file mode 100644 index cc0404d..0000000 --- a/app-clock/src/main/java/cn/teachcourse/builder/WatchView.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.teachcourse.builder; - -import android.content.Context; -import android.graphics.Canvas; -import android.support.annotation.Nullable; -import android.util.AttributeSet; -import android.view.View; - -/** - * Created by postmaster@teachcourse.cn on 2017/4/23. - */ - -public abstract class WatchView extends View { - public WatchView(Context context) { - super(context); - } - - public WatchView(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - } - public abstract void paint(Canvas canvas); -} diff --git a/app-clock/src/main/java/cn/teachcourse/builder/WatchViewActivity.java b/app-clock/src/main/java/cn/teachcourse/builder/WatchViewActivity.java deleted file mode 100644 index 8e3ec8e..0000000 --- a/app-clock/src/main/java/cn/teachcourse/builder/WatchViewActivity.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.teachcourse.builder; - -import android.graphics.Color; -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; - - -public class WatchViewActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Builder builder=new WatchViewImpl.BuilderImpl(this); - builder.setRadius(300f).setMinuteColor(Color.BLUE).setSecondColor(Color.RED).setHourColor(0xff999999); -// builder.setPadding(10f); -// builder.setShortScaleColor(Color.WHITE); - WatchViewImpl watchView=builder.create(); - setContentView(watchView); -// setContentView(R.layout.activity_watch_view); - } - -} diff --git a/app-clock/src/main/java/cn/teachcourse/builder/WatchViewImpl.java b/app-clock/src/main/java/cn/teachcourse/builder/WatchViewImpl.java deleted file mode 100644 index 2073f3b..0000000 --- a/app-clock/src/main/java/cn/teachcourse/builder/WatchViewImpl.java +++ /dev/null @@ -1,402 +0,0 @@ -package cn.teachcourse.builder; - -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.RectF; -import android.support.annotation.Nullable; -import android.util.AttributeSet; -import android.util.TypedValue; - -import java.util.Calendar; - -/** - * Created by postmaster@teachcourse.cn on 2017/4/20. - */ - -public class WatchViewImpl extends WatchView { - /** - * 钟表半径,默认为0 - */ - private float mRadius; - /** - * 钟表字体,默认大小 - */ - private static final int DEFAULT_TEXT_SIZE = 16; - /** - * 如果未设置内边距,使用该默认值 - */ - private static final float DEFAULT_PADDING = 1 / 25f; - /** - * 如果为设置时针形状大小,使用默认值 - */ - private static final float DEFAULT_HOUR_WIDTH = 5; - /** - * 如果为设置分针形状大小,使用默认值 - */ - private static final float DEFAULT_MINUTE_WIDTH = 3; - /** - * 如果为设置秒针形状大小,使用默认值 - */ - private static final float DEFAULT_SECOND_WIDTH = 2; - /** - * 绘制时针、分针和秒针默认的圆角大小 - */ - private static final int DEFAULT_BORDER_RADIUS = 10; - /** - * 以当前View中心点位为准,时针、分针、秒针凸出的长度(偏移中心的距离) - */ - private static final float DEFAULT_EXTRAS_WIDTH = 1 / 6f; - /** - * 设置默认属性变量 - */ - private float mPadding; //边距 - private float mTextSize; //文字大小 - private float mHourWidth; //时针宽度 - private float mMinuteWidth; //分针宽度 - private float mSecondWidth; //秒针宽度 - /** - * 默认背景颜色 - */ - private static final int DEFAULT_BACKGROUND_COLOR = Color.WHITE; /** - * 默认外部背景颜色 - */ - private static final int DEFAULT_BACKGROUND_EXTERNAL_COLOR = Color.GRAY; - /** - * 默认时针/分针/秒针颜色 - */ - private static final int DEFAULT_HOUR_COLOR = Color.BLACK; - private static final int DEFAULT_MINUTE_COLOR = Color.BLACK; - private static final int DEFAULT_SECOND_COLOR = Color.RED; - /** - * 默认长/短刻度颜色 - */ - private static final int DEFAULT_LONG_SCALE_COLOR = Color.BLACK; - private static final int DEFAULT_SHORT_SCALE_COLOR = Color.GRAY; - /** - * 设置默认属性变量 - */ - private int mHourColor; //时针的颜色 - private int mMinuteColor; //分针的颜色 - private int mSecondColor; //秒针的颜色 - private int mLongScaleColor; //长线的颜色 - private int mShortScaleColor; //短线的颜色 - private int mBackgroundColor;//钟表的背景色 - private int mBackgroundExternalColor;//钟表的背景色 - /** - * 画笔 - */ - private Paint mPaint; - - public WatchViewImpl(Context context) { - this(context, null); - } - - public WatchViewImpl(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - init(); - } - - /** - * 初始化基本数据 - */ - private void init() { - mPaint = new Paint(); - mPaint.setAntiAlias(true); - mPaint.setDither(true); - } - - public float getDpVal(float dp) { - Resources res = getContext().getResources(); - if (res != null) - return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, res.getDisplayMetrics()); - return dp; - } - - public float getSpVal(float sp) { - Resources res = getContext().getResources(); - if (res != null) - return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, res.getDisplayMetrics()); - return sp; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - int resWidth; - int resHeight; - /** - * 根据传入的参数,分别获取测量模式和测量值 - */ - int width = MeasureSpec.getSize(widthMeasureSpec); - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - - int height = MeasureSpec.getSize(heightMeasureSpec); - int heightMode = MeasureSpec.getMode(heightMeasureSpec); - - /** - * 如果宽或者高的测量模式非精确值 - */ - if (widthMode != MeasureSpec.EXACTLY || heightMode != MeasureSpec.EXACTLY) { - resWidth = resHeight = 0; - } else { - resWidth=width; - resHeight=height; - } - setMeasuredDimension(resWidth, resHeight); - /** - * 测量的目的:获取当前矩形的宽度、高度,计算半径大小 - */ - if (mRadius == 0) - mRadius = Math.min(getMeasuredWidth(), getMeasuredHeight()) / 2f; - } - - - @Override - protected void onDraw(Canvas canvas) { - paint(canvas); - postInvalidateDelayed(1000); - } - - /** - * 开始绘制钟表 - * @param canvas - */ - public void paint(Canvas canvas) { - //移动画布中心点到当前View中心 - canvas.translate(getWidth() / 2, getHeight() / 2); - //绘制外圆背景颜色 - paintExternalCircle(canvas); - //绘制内圆背景颜色 - paintCircle(canvas); - //绘制刻度 - paintScale(canvas); - //绘制指针 - paintPointer(canvas); - } - /** - * 绘制钟表外部圆形背景 - */ - public void paintExternalCircle(Canvas canvas) { - mPaint.setColor(mBackgroundExternalColor == 0 ? DEFAULT_BACKGROUND_EXTERNAL_COLOR : mBackgroundExternalColor); - mPaint.setStyle(Paint.Style.FILL); - canvas.drawCircle(0, 0, mRadius, mPaint); - } - /** - * 绘制钟表的内部圆形背景 - * - * @param canvas - */ - public void paintCircle(Canvas canvas) { - float padding = mPadding == 0 ? mRadius*DEFAULT_PADDING : mPadding; - mPaint.setColor(mBackgroundColor == 0 ? DEFAULT_BACKGROUND_COLOR : mBackgroundColor); - mPaint.setStyle(Paint.Style.FILL); - canvas.drawCircle(0, 0, mRadius-padding, mPaint); - } - - /** - * 绘制钟表刻度 - * - * @param canvas - */ - private void paintScale(Canvas canvas) { - float padding = mPadding == 0 ? mRadius*DEFAULT_PADDING : mPadding; - float textSize = mTextSize == 0 ? getSpVal(DEFAULT_TEXT_SIZE) : mTextSize; - for (int i = 0; i < 60; i++) { - if (i % 5 == 0) { - //绘制长刻度 - mPaint.setStrokeWidth(getDpVal(1.5f)); - mPaint.setColor(mLongScaleColor == 0 ? DEFAULT_LONG_SCALE_COLOR : mLongScaleColor); - mPaint.setTextSize(textSize); - String text = ((i / 5) == 0 ? 12 : (i / 5)) + ""; - Rect textBound = new Rect(); - mPaint.getTextBounds(text, 0, text.length(), textBound); - canvas.save(); - canvas.translate(0, -mRadius + getDpVal(5) + 40 + padding + (textBound.bottom - textBound.top) / 2); - mPaint.setStyle(Paint.Style.FILL); - canvas.rotate(-6 * i); - canvas.drawText(text, -(textBound.right + textBound.left) / 2, -(textBound.bottom + textBound.top) / 2, mPaint); - canvas.restore(); - } else { - //绘制短刻度 - mPaint.setStrokeWidth(getDpVal(1)); - mPaint.setColor(mShortScaleColor == 0 ? DEFAULT_SHORT_SCALE_COLOR : mShortScaleColor); - mPaint.setStrokeWidth(getDpVal(1)); - } - canvas.drawLine(0, -mRadius + padding, 0, -mRadius + padding + 30, mPaint); - //旋转画布,实现圆弧绘制线条的效果 - canvas.rotate(6); - } - } - - /** - * 绘制钟表上的时针、分针、秒针 - * - * @param canvas - */ - private void paintPointer(Canvas canvas) { - Calendar calendar = Calendar.getInstance(); - int hour = calendar.get(Calendar.HOUR_OF_DAY); //时 - int minute = calendar.get(Calendar.MINUTE); //分 - int second = calendar.get(Calendar.SECOND); //秒 - int angleHour = (hour % 12) * 360 / 12; //时针转过的角度 - int angleMinute = minute * 360 / 60; //分针转过的角度 - int angleSecond = second * 360 / 60; //秒针转过的角度 - //绘制时针 - canvas.save(); - canvas.rotate(angleHour); //旋转到时针的角度 - float hourWidth = mHourWidth == 0 ? getDpVal(DEFAULT_HOUR_WIDTH) : mHourWidth; - RectF rectFHour = new RectF(-hourWidth / 2, -mRadius * 3 / 5, hourWidth / 2, mRadius * DEFAULT_EXTRAS_WIDTH); - mPaint.setColor(mHourColor == 0 ? DEFAULT_HOUR_COLOR : mHourColor); //设置指针颜色 - mPaint.setStyle(Paint.Style.STROKE); - mPaint.setStrokeWidth(hourWidth); //设置边界宽度 - canvas.drawRoundRect(rectFHour, DEFAULT_BORDER_RADIUS, DEFAULT_BORDER_RADIUS, mPaint); //绘制时针 - canvas.restore(); - //绘制分针 - canvas.save(); - canvas.rotate(angleMinute); - float minuteWidth = mMinuteWidth == 0 ? getDpVal(DEFAULT_MINUTE_WIDTH) : mMinuteWidth; - RectF rectFMinute = new RectF(-minuteWidth / 2, -mRadius * 3.5f / 5, minuteWidth / 2, mRadius * DEFAULT_EXTRAS_WIDTH); - mPaint.setColor(mMinuteColor == 0 ? DEFAULT_MINUTE_COLOR : mMinuteColor); - mPaint.setStrokeWidth(minuteWidth); - canvas.drawRoundRect(rectFMinute, DEFAULT_BORDER_RADIUS, DEFAULT_BORDER_RADIUS, mPaint); - canvas.restore(); - //绘制秒针 - canvas.save(); - canvas.rotate(angleSecond); - float secondWidth = mSecondWidth == 0 ? getDpVal(DEFAULT_SECOND_WIDTH) : mSecondWidth; - RectF rectFSecond = new RectF(-secondWidth / 2, -mRadius + 15, secondWidth / 2, mRadius * DEFAULT_EXTRAS_WIDTH); - mPaint.setColor(mSecondColor == 0 ? DEFAULT_SECOND_COLOR : mSecondColor); - mPaint.setStrokeWidth(secondWidth); - canvas.drawRoundRect(rectFSecond, DEFAULT_BORDER_RADIUS, DEFAULT_BORDER_RADIUS, mPaint); - canvas.restore(); - //绘制中心小圆 - mPaint.setStyle(Paint.Style.FILL); - mPaint.setColor(mSecondColor == 0 ? DEFAULT_SECOND_COLOR : mSecondColor); - canvas.drawCircle(0, 0, secondWidth * 4, mPaint); - } - - public static class BuilderImpl extends Builder { - private Context context; - /** - * 定义相关默认属性 - */ - private float radius;//设置半径长度 - private float padding; //边距 - - - - private float textSize; //文字大小 - private float hourWidth; //时针宽度 - private float minuteWidth; //分针宽度 - private float secondWidth; //秒针宽度 - /** - * 默认颜色 - */ - private int longScaleColor; //长线的颜色 - private int shortScaleColor; //短线的颜色 - private int hourColor; //时针的颜色 - private int minuteColor; //分针的颜色 - private int secondColor; //秒针的颜色 - private int backgroundColor;//钟表的背景色 - private int backgroundExternalColor;//钟表的背景色 - - public BuilderImpl(Context context) { - this.context = context; - } - - public Builder setRadius(float radius) { - this.radius = radius; - return this; - } - - public void setBackgroundExterColor(int backgroundExterColor) { - this.backgroundExternalColor = backgroundExterColor; - } - - public Builder setTextSize(float textSize) { - this.textSize = textSize; - return this; - } - - public Builder setHourWidth(float hourWidth) { - this.hourWidth = hourWidth; - return this; - } - - public Builder setMinuteWidth(float minuteWidth) { - this.minuteWidth = minuteWidth; - return this; - } - - public Builder setSecondWidth(float secondWidth) { - this.secondWidth = secondWidth; - return this; - } - - public Builder setLongScaleColor(int longScaleColor) { - this.longScaleColor = longScaleColor; - return this; - } - - public Builder setShortScaleColor(int shortScaleColor) { - this.shortScaleColor = shortScaleColor; - return this; - } - - public Builder setHourColor(int hourColor) { - this.hourColor = hourColor; - return this; - } - - public Builder setMinuteColor(int minuteColor) { - this.minuteColor = minuteColor; - return this; - } - - public Builder setSecondColor(int secondColor) { - this.secondColor = secondColor; - return this; - } - - public Builder setBackgroundColor(int backgroundColor) { - this.backgroundColor = backgroundColor; - return this; - } - - - - public Builder setPadding(float padding) { - this.padding = padding; - return this; - } - - - public WatchViewImpl create() { - final WatchViewImpl watchView = new WatchViewImpl(context); - /** - * 设置大小 - */ - watchView.mRadius = radius; - watchView.mPadding = padding; - watchView.mTextSize = textSize; - watchView.mHourWidth = hourWidth; - watchView.mMinuteWidth = minuteWidth; - watchView.mSecondWidth = secondWidth; - /** - * 设置颜色值 - */ - watchView.mHourColor = hourColor; - watchView.mMinuteColor = minuteColor; - watchView.mSecondColor = secondColor; - watchView.mLongScaleColor = longScaleColor; - watchView.mShortScaleColor = shortScaleColor; - watchView.mBackgroundColor = backgroundColor; - watchView.mBackgroundExternalColor = backgroundExternalColor; - return watchView; - } - } -} diff --git a/app-clock/src/main/java/cn/teachcourse/strategy/IClock.java b/app-clock/src/main/java/cn/teachcourse/strategy/IClock.java deleted file mode 100644 index 210c2cb..0000000 --- a/app-clock/src/main/java/cn/teachcourse/strategy/IClock.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.teachcourse.strategy; - -import android.graphics.Canvas; -import android.graphics.Paint; - -/** - * Created by http://teachcourse.cn on 2017/7/5. - */ - -public interface IClock { - void paint(Canvas canvas); -} diff --git a/app-clock/src/main/java/cn/teachcourse/strategy/WatchViewActivity.java b/app-clock/src/main/java/cn/teachcourse/strategy/WatchViewActivity.java deleted file mode 100644 index 11010a4..0000000 --- a/app-clock/src/main/java/cn/teachcourse/strategy/WatchViewActivity.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.teachcourse.strategy; - -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; - -import cn.teachcourse.strategy.impl.DefaultClockImpl; -import cn.teachcourse.strategy.impl.DesignClockImpl; -import cn.teachcourse.strategy.impl.NormalClockImpl; - - -public class WatchViewActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); -// defaultStrategy(); -// normalStrategy(); - designStrategy(); - - cn.teachcourse.strategy.WatchViewImpl watchView=new cn.teachcourse.strategy.WatchViewImpl(this); - /*第一种策略:默认算法*/ - IClock defaultClock=new DefaultClockImpl(watchView); - /*第二种策略:常用算法*/ - IClock normalClock=new NormalClockImpl(watchView); - /*第二种策略:设计算法*/ - IClock designClock = new DesignClockImpl(watchView); - - /*自由选择使用其中的一种策略,比如:normalClock*/ - watchView.setIClock(designClock); - setContentView(watchView); - } - - private void defaultStrategy() { - /*第一种策略:默认算法*/ - cn.teachcourse.strategy.WatchViewImpl watchView=new cn.teachcourse.strategy.WatchViewImpl(this); - IClock defaultClock=new DefaultClockImpl(watchView); - watchView.setIClock(defaultClock); - - } - - private void normalStrategy() { - /*第二种策略:常用算法*/ - cn.teachcourse.strategy.WatchViewImpl watchView=new cn.teachcourse.strategy.WatchViewImpl(this); - IClock normalClock=new NormalClockImpl(watchView); - watchView.setIClock(normalClock); - setContentView(watchView); - } - - private void designStrategy() { - /*第二种策略:设计算法*/ - cn.teachcourse.strategy.WatchViewImpl watchView = new cn.teachcourse.strategy.WatchViewImpl(this); - IClock designClock = new DesignClockImpl(watchView); - watchView.setIClock(designClock); - setContentView(watchView); - } - -} diff --git a/app-clock/src/main/java/cn/teachcourse/strategy/WatchViewImpl.java b/app-clock/src/main/java/cn/teachcourse/strategy/WatchViewImpl.java deleted file mode 100644 index 63003ce..0000000 --- a/app-clock/src/main/java/cn/teachcourse/strategy/WatchViewImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -package cn.teachcourse.strategy; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.support.annotation.Nullable; -import android.util.AttributeSet; -import android.view.View; - -import cn.teachcourse.UnitConvertUtil; -import cn.teachcourse.strategy.impl.DefaultClockImpl; - -/** - * Created by postmaster@teachcourse.cn on 2017/4/20. - */ - -public class WatchViewImpl extends View{ - /** - * 钟表半径,默认为0 - */ - private float radius; - /** - * 画笔 - */ - private Context context; - private Paint paint; - private IClock iClock; - - public void setIClock(IClock iClock) { - this.iClock = iClock; - } - - public WatchViewImpl(Context context) { - this(context, null); - } - - public WatchViewImpl(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - - init(context); - } - - /** - * 初始化基本数据 - */ - private void init(Context context) { - this.context=context; - paint = new Paint(); - paint.setAntiAlias(true); - paint.setDither(true); - iClock=new DefaultClockImpl(this); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - int resWidth; - int resHeight; - /** - * 根据传入的参数,分别获取测量模式和测量值 - */ - int width = MeasureSpec.getSize(widthMeasureSpec); - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - - int height = MeasureSpec.getSize(heightMeasureSpec); - int heightMode = MeasureSpec.getMode(heightMeasureSpec); - - /** - * 如果宽或者高的测量模式非精确值 - */ - if (widthMode != MeasureSpec.EXACTLY || heightMode != MeasureSpec.EXACTLY) { - resWidth = resHeight = 0; - } else { - resWidth=width; - resHeight=height; - } - setMeasuredDimension(resWidth, resHeight); - /** - * 测量的目的:获取当前矩形的宽度、高度,计算半径大小 - */ - if (radius == 0) - radius = Math.min(getMeasuredWidth(), getMeasuredHeight()) / 2f; - } - - - @Override - protected void onDraw(Canvas canvas) { - paint(canvas); - postInvalidateDelayed(1000); - } - - /** - * 开始绘制钟表 - * @param canvas - */ - public void paint(Canvas canvas) { - iClock.paint(canvas); - } - - public float getRadius() { - return radius; - } - - public void setRadius(float radius) { - this.radius = radius; - } - - public Paint getPaint() { - return paint; - } - - public void setPaint(Paint paint) { - this.paint = paint; - } - - public float getSpVal(float sp){ - return UnitConvertUtil.getSpVal(context,sp); - } - public float getDpVal(float dp){ - return UnitConvertUtil.getDpVal(context,dp); - } -} diff --git a/app-clock/src/main/java/cn/teachcourse/strategy/impl/DefaultClockImpl.java b/app-clock/src/main/java/cn/teachcourse/strategy/impl/DefaultClockImpl.java deleted file mode 100644 index 889657b..0000000 --- a/app-clock/src/main/java/cn/teachcourse/strategy/impl/DefaultClockImpl.java +++ /dev/null @@ -1,235 +0,0 @@ -package cn.teachcourse.strategy.impl; - -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.RectF; - -import java.util.Calendar; - -import cn.teachcourse.UnitConvertUtil; -import cn.teachcourse.strategy.IClock; -import cn.teachcourse.strategy.WatchViewImpl; - -/** - * Created by http://teachcourse.cn on 2017/7/5. - */ - -public class DefaultClockImpl implements IClock { - - private WatchViewImpl watchView; - /** - * 钟表字体,默认大小 - */ - private static final int DEFAULT_TEXT_SIZE = 16; - /** - * 如果未设置内边距,使用该默认值 - */ - private static final float DEFAULT_PADDING = 1 / 25f; - /** - * 如果为设置时针形状大小,使用默认值 - */ - private static final float DEFAULT_HOUR_WIDTH = 5f; - /** - * 如果为设置分针形状大小,使用默认值 - */ - private static final float DEFAULT_MINUTE_WIDTH = 3f; - /** - * 如果为设置秒针形状大小,使用默认值 - */ - private static final float DEFAULT_SECOND_WIDTH = 2f; - /** - * 绘制时针、分针和秒针默认的圆角大小 - */ - private static final int DEFAULT_BORDER_RADIUS = 10; - /** - * 以当前View中心点位为准,时针、分针、秒针凸出的长度(偏移中心的距离) - */ - private static final float DEFAULT_EXTRAS_WIDTH = 1 / 6f; - /** - * 设置默认属性变量 - */ - private float mPadding; //边距 - private float mTextSize; //文字大小 - private float mHourWidth; //时针宽度 - private float mMinuteWidth; //分针宽度 - private float mSecondWidth; //秒针宽度 - /** - * 默认背景颜色 - */ - private static final int DEFAULT_BACKGROUND_COLOR = Color.WHITE; - /** - * 默认外部背景颜色 - */ - private static final int DEFAULT_BACKGROUND_EXTERNAL_COLOR = Color.GRAY; - /** - * 默认时针/分针/秒针颜色 - */ - private static final int DEFAULT_HOUR_COLOR = Color.BLACK; - private static final int DEFAULT_MINUTE_COLOR = Color.BLACK; - private static final int DEFAULT_SECOND_COLOR = Color.RED; - /** - * 默认长/短刻度颜色 - */ - private static final int DEFAULT_LONG_SCALE_COLOR = Color.BLACK; - private static final int DEFAULT_SHORT_SCALE_COLOR = Color.GRAY; - /** - * 设置默认属性变量 - */ - private int mHourColor; //时针的颜色 - private int mMinuteColor; //分针的颜色 - private int mSecondColor; //秒针的颜色 - private int mLongScaleColor; //长线的颜色 - private int mShortScaleColor; //短线的颜色 - private int mBackgroundColor;//钟表的背景色 - private int mBackgroundExternalColor;//钟表的背景色 - - public DefaultClockImpl(WatchViewImpl watchView) { - this.watchView = watchView; - } - - @Override - public void paint(Canvas canvas) { - //移动画布中心点到当前View中心 - canvas.translate(getWidth() / 2, getHeight() / 2); - //绘制外圆背景颜色 - paintExternalCircle(canvas); - //绘制内圆背景颜色 - paintCircle(canvas); - //绘制刻度 - paintScale(canvas); - //绘制指针 - paintPointer(canvas); - } - - - - /** - * 绘制钟表外部圆形背景 - */ - public void paintExternalCircle(Canvas canvas) { - getPaint().setColor(mBackgroundExternalColor == 0 ? DEFAULT_BACKGROUND_EXTERNAL_COLOR : mBackgroundExternalColor); - getPaint().setStyle(Paint.Style.FILL); - canvas.drawCircle(0, 0, getRadius(), getPaint()); - } - - /** - * 绘制钟表的内部圆形背景 - * - * @param canvas - */ - public void paintCircle(Canvas canvas) { - float padding = mPadding == 0 ? getRadius() * DEFAULT_PADDING : mPadding; - getPaint().setColor(mBackgroundColor == 0 ? DEFAULT_BACKGROUND_COLOR : mBackgroundColor); - getPaint().setStyle(Paint.Style.FILL); - canvas.drawCircle(0, 0, getRadius() - padding, getPaint()); - } - - /** - * 绘制钟表刻度 - * - * @param canvas - */ - private void paintScale(Canvas canvas) { - float padding = mPadding == 0 ? getRadius() * DEFAULT_PADDING : mPadding; - float textSize = mTextSize == 0 ? getSpVal(DEFAULT_TEXT_SIZE) : mTextSize; - for (int i = 0; i < 60; i++) { - if (i % 5 == 0) { - //绘制长刻度 - getPaint().setStrokeWidth(getDpVal(1.5f)); - getPaint().setColor(mLongScaleColor == 0 ? DEFAULT_LONG_SCALE_COLOR : mLongScaleColor); - getPaint().setTextSize(textSize); - String text = ((i / 5) == 0 ? 12 : (i / 5)) + ""; - Rect textBound = new Rect(); - getPaint().getTextBounds(text, 0, text.length(), textBound); - canvas.save(); - canvas.translate(0, -getRadius() + getDpVal(5) + 40 + padding + (textBound.bottom - textBound.top) / 2); - getPaint().setStyle(Paint.Style.FILL); - canvas.rotate(-6 * i); - canvas.drawText(text, -(textBound.right + textBound.left) / 2, -(textBound.bottom + textBound.top) / 2, getPaint()); - canvas.restore(); - } else { - //绘制短刻度 - getPaint().setStrokeWidth(getDpVal(1)); - getPaint().setColor(mShortScaleColor == 0 ? DEFAULT_SHORT_SCALE_COLOR : mShortScaleColor); - getPaint().setStrokeWidth(getDpVal(1)); - } - canvas.drawLine(0, -getRadius() + padding, 0, -getRadius() + padding + 30, getPaint()); - //旋转画布,实现圆弧绘制线条的效果 - canvas.rotate(6); - } - } - - /** - * 绘制钟表上的时针、分针、秒针 - * - * @param canvas - */ - private void paintPointer(Canvas canvas) { - Calendar calendar = Calendar.getInstance(); - int hour = calendar.get(Calendar.HOUR_OF_DAY); //时 - int minute = calendar.get(Calendar.MINUTE); //分 - int second = calendar.get(Calendar.SECOND); //秒 - int angleHour = (hour % 12) * 360 / 12; //时针转过的角度 - int angleMinute = minute * 360 / 60; //分针转过的角度 - int angleSecond = second * 360 / 60; //秒针转过的角度 - //绘制时针 - canvas.save(); - canvas.rotate(angleHour); //旋转到时针的角度 - float hourWidth = mHourWidth == 0 ? getDpVal(DEFAULT_HOUR_WIDTH) : mHourWidth; - RectF rectFHour = new RectF(-hourWidth / 2, -getRadius() * 3 / 5, hourWidth / 2, getRadius() * DEFAULT_EXTRAS_WIDTH); - getPaint().setColor(mHourColor == 0 ? DEFAULT_HOUR_COLOR : mHourColor); //设置指针颜色 - getPaint().setStyle(Paint.Style.STROKE); - getPaint().setStrokeWidth(hourWidth); //设置边界宽度 - canvas.drawRoundRect(rectFHour, DEFAULT_BORDER_RADIUS, DEFAULT_BORDER_RADIUS, getPaint()); //绘制时针 - canvas.restore(); - //绘制分针 - canvas.save(); - canvas.rotate(angleMinute); - float minuteWidth = mMinuteWidth == 0 ? getDpVal(DEFAULT_MINUTE_WIDTH) : mMinuteWidth; - RectF rectFMinute = new RectF(-minuteWidth / 2, -getRadius() * 3.5f / 5, minuteWidth / 2, getRadius() * DEFAULT_EXTRAS_WIDTH); - getPaint().setColor(mMinuteColor == 0 ? DEFAULT_MINUTE_COLOR : mMinuteColor); - getPaint().setStrokeWidth(minuteWidth); - canvas.drawRoundRect(rectFMinute, DEFAULT_BORDER_RADIUS, DEFAULT_BORDER_RADIUS, getPaint()); - canvas.restore(); - //绘制秒针 - canvas.save(); - canvas.rotate(angleSecond); - float secondWidth = mSecondWidth == 0 ? getDpVal(DEFAULT_SECOND_WIDTH) : mSecondWidth; - RectF rectFSecond = new RectF(-secondWidth / 2, -getRadius() + 15, secondWidth / 2, getRadius() * DEFAULT_EXTRAS_WIDTH); - getPaint().setColor(mSecondColor == 0 ? DEFAULT_SECOND_COLOR : mSecondColor); - getPaint().setStrokeWidth(secondWidth); - canvas.drawRoundRect(rectFSecond, DEFAULT_BORDER_RADIUS, DEFAULT_BORDER_RADIUS, getPaint()); - canvas.restore(); - //绘制中心小圆 - getPaint().setStyle(Paint.Style.FILL); - getPaint().setColor(mSecondColor == 0 ? DEFAULT_SECOND_COLOR : mSecondColor); - canvas.drawCircle(0, 0, secondWidth * 4, getPaint()); - } - - - private float getRadius() { - return watchView.getRadius(); - } - - private Paint getPaint() { - return watchView.getPaint(); - } - - private float getSpVal(float sp) { - return watchView.getSpVal(sp); - } - - private float getDpVal(float dp) { - return watchView.getDpVal(dp); - } - - private int getHeight() { - return watchView.getHeight(); - } - - private int getWidth() { - return watchView.getWidth(); - } -} diff --git a/app-clock/src/main/java/cn/teachcourse/strategy/impl/DesignClockImpl.java b/app-clock/src/main/java/cn/teachcourse/strategy/impl/DesignClockImpl.java deleted file mode 100644 index 21dbb71..0000000 --- a/app-clock/src/main/java/cn/teachcourse/strategy/impl/DesignClockImpl.java +++ /dev/null @@ -1,172 +0,0 @@ -package cn.teachcourse.strategy.impl; - -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.RectF; -import android.os.Handler; -import android.os.Message; -import android.os.SystemClock; - -import java.util.Calendar; -import java.util.TimeZone; - -import cn.teachcourse.strategy.IClock; -import cn.teachcourse.strategy.WatchViewImpl; - -/** - * Created by http://teachcourse.cn on 2017/7/5. - */ - -public class DesignClockImpl implements IClock { - private WatchViewImpl watchView; - private static final int H_POINTER_WIDTH = 15; //时针宽 - private static final int M_POINTER_WIDTH = 10; //分针宽 - private static final int S_POINTER_WIDTH = 5; //秒针宽 - private static final int SCALE_LINE_LENGTH = 50; //刻度线长 - private static final int SCALE_LINE_WIDTH = 6; //刻度线宽 - private static final int M_S_DEGREES_UNIT = 360 / 60; //分、秒针每个数字走的角度 - private static final int H_DEGREES_UNIT = 360 / 12; //时针每个数字走的角度 - private Paint mPaint; - private int mW, mH, mCx, mCy, mR; - private int mCount; - private Path mPath; - - private Handler mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - postInvalidate(); - } - - }; - - - public DesignClockImpl(WatchViewImpl watchView) { - this.watchView = watchView; - mPaint=new Paint(); - mPath = new Path(); - } - - @Override - public void paint(Canvas canvas) { - long beginTime = SystemClock.uptimeMillis(); - mW = getWidth(); - mH = getHeight(); - - mR = Math.min(mW, mH) / 2 - 20; - mCx = mW / 2; - mCy = mH / 2; - - mPaint.setColor(Color.WHITE); - canvas.drawCircle(mCx, mCy, mR, mPaint); //外圆 - mPaint.setColor(Color.BLACK); - canvas.drawCircle(mCx, mCy, mR / 12, mPaint); //圆心 - - /* - 绘制刻度 - */ - for (int i = 0; i < 60; i++) { - canvas.save(); - canvas.rotate(M_S_DEGREES_UNIT * i, mCx, mCy); - mPaint.setStrokeWidth(SCALE_LINE_WIDTH); - canvas.drawLine(mCx, mCy - mR, mCx, mCy - mR + SCALE_LINE_LENGTH, mPaint); - if (i % 5 == 0) {//小时刻度和数字 - mPaint.setStrokeWidth(SCALE_LINE_WIDTH + 5); - canvas.drawLine(mCx, mCy - mR, mCx, mCy - mR + SCALE_LINE_LENGTH + 10, mPaint); - - String num = i == 0 ? 12 + "" : i / 5 + ""; - float x = mCx - mPaint.measureText(num) / 2; - float y = mCy - mR + SCALE_LINE_LENGTH + 30; - mPaint.setTextSize(50); - canvas.drawText(num, x, y + Math.abs(mPaint.ascent()), mPaint); - } - canvas.restore(); - - } - - Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8")); - int hour = calendar.get(Calendar.HOUR); - int minute = calendar.get(Calendar.MINUTE); - int second = calendar.get(Calendar.SECOND); - - /* - 分针在最下面 最先绘制 - */ - canvas.save(); - float mDegrees = minute * M_S_DEGREES_UNIT; - canvas.rotate(mDegrees, mCx, mCy); - mPaint.setColor(Color.GREEN); - mPath.reset(); - mPath.addRect(new RectF(mCx - M_POINTER_WIDTH, mCy - mR / 4 * 3, mCx + M_POINTER_WIDTH, mCy + mR / 5), Path.Direction.CW); - mPath.quadTo(mCx, mCy - mR / 4 * 3 - 40, mCx + M_POINTER_WIDTH, mCy - mR / 4 * 3); - canvas.drawPath(mPath, mPaint); - canvas.restore(); - - /* - 时针在中间 - 分针60分走360度; 时针1小时(即60分)走30度 - mDegrees:hDegrees = 360:30 = 12:1 - hDegrees = mDegrees / 12; 时针相对于分钟数所要走的角度 - */ - canvas.save(); - canvas.rotate(mDegrees / 12 + hour * H_DEGREES_UNIT, mCx, mCy); - mPaint.setColor(Color.RED); - mPath.reset(); - mPath.addRect(new RectF(mCx - H_POINTER_WIDTH, mCy - mR / 3 * 2, mCx + H_POINTER_WIDTH, mCy + mR / 5), Path.Direction.CW); - mPath.quadTo(mCx, mCy - mR / 3 * 2 - 30, mCx + H_POINTER_WIDTH, mCy - mR / 3 * 2); - canvas.drawPath(mPath, mPaint); - canvas.restore(); - - /* - 秒针在最上面 - */ - canvas.save(); - canvas.rotate(second * M_S_DEGREES_UNIT, mCx, mCy); - mPaint.setColor(Color.BLACK); - mPath.reset(); - mPath.addRect(new RectF(mCx - S_POINTER_WIDTH, mCy - mR / 5 * 4, mCx + S_POINTER_WIDTH, mCy + mR / 5), Path.Direction.CW); - mPath.quadTo(mCx, mCy - mR / 5 * 4 - 30, mCx + S_POINTER_WIDTH, mCy - mR / 5 * 4); - canvas.drawPath(mPath, mPaint); - canvas.restore(); - - long spanTime = SystemClock.uptimeMillis() - beginTime; -// System.out.println("间隔时间" + spanTime); - if (mCount < 5) {//12的位置开始绘制时位置不对,刷新一次后就正常,这里让其快速刷新几次 - mHandler.sendEmptyMessage(0); - mCount++; - } else - mHandler.sendEmptyMessageDelayed(0, 1000 - spanTime); - } - - private float getRadius() { - return watchView.getRadius(); - } - - private Paint getPaint() { - Paint paint = watchView.getPaint(); - paint.setStyle(Paint.Style.STROKE); - return paint; - } - - private float getSpVal(float sp) { - return watchView.getSpVal(sp); - } - - private float getDpVal(float dp) { - return watchView.getDpVal(dp); - } - - private int getHeight() { - return watchView.getHeight(); - } - - private int getWidth() { - return watchView.getWidth(); - } - - private void postInvalidate() { - watchView.postInvalidate(); - } -} diff --git a/app-clock/src/main/java/cn/teachcourse/strategy/impl/NormalClockImpl.java b/app-clock/src/main/java/cn/teachcourse/strategy/impl/NormalClockImpl.java deleted file mode 100644 index 52a1464..0000000 --- a/app-clock/src/main/java/cn/teachcourse/strategy/impl/NormalClockImpl.java +++ /dev/null @@ -1,154 +0,0 @@ -package cn.teachcourse.strategy.impl; - -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; - -import java.util.Calendar; - -import cn.teachcourse.strategy.IClock; -import cn.teachcourse.strategy.WatchViewImpl; - -/** - * Created by http://teachcourse.cn on 2017/7/5. - */ - -public class NormalClockImpl implements IClock { - private WatchViewImpl watchView; - private Calendar calendar; - - public NormalClockImpl(WatchViewImpl watchView) { - this.watchView = watchView; - calendar = Calendar.getInstance(); - } - - @Override - public void paint(Canvas canvas) { - //计算圆盘直径,取短的 - int len = Math.min(getWidth(), getHeight()); - //绘制表盘 - drawPlate(canvas, len); - //绘制指针 - drawPoints(canvas, len); - } - - /** - * 绘制表盘 - * - * @param canvas - * @param len 组件宽度 - */ - protected void drawPlate(Canvas canvas, int len) { - canvas.save(); - //画圆 - int r = len / 2; - canvas.drawCircle(r, r, r, getPaint()); - //画刻度(一共有 60 根) - for (int i = 0; i < 60; i++) { - if (i % 5 == 0) { - //长刻度,长刻度占圆半径的 1/10 - getPaint().setColor(Color.RED); - getPaint().setStrokeWidth(4); - canvas.drawLine(r + 9 * r / 10, r, len, r, getPaint()); - } else { - //短刻度,长刻度占圆半径的 1/15 - getPaint().setColor(Color.GRAY); - getPaint().setStrokeWidth(1); - canvas.drawLine(r + 14 * r / 15, r, len, r, getPaint()); - } - //以(r,r)为中心,将画布旋转 6 度 - canvas.rotate(6, r, r); - } - canvas.restore(); - } - - /** - * 画指针 - * - * @param canvas - * @param len - */ - protected void drawPoints(Canvas canvas, int len) { - //先获取系统时间 - calendar.setTimeInMillis(System.currentTimeMillis()); - //获取时分秒 - int hours = calendar.get(Calendar.HOUR) % 12;//转换为 12 小时制 - int minutes = calendar.get(Calendar.MINUTE); - int seconds = calendar.get(Calendar.SECOND); - //画时针 - //角度(顺时针) - int degree = 360 / 12 * hours; - //转换成弧度 - double radians = Math.toRadians(degree); - //根据当前时计算时针两个点的坐标 - //起点(圆中心),终点:计算得到 - int r = len / 2; - int startX = r; - int startY = r; - int endX = (int) (startX + r * 0.5 * Math.cos(radians)); - int endY = (int) (startY + r * 0.5 * Math.sin(radians)); - canvas.save(); - getPaint().setStrokeWidth(4); - //0 度从 3 点处开始,时间从 12 点处开始,所以需要将画布旋转 90 度 - canvas.rotate(-90, r, r); - canvas.drawLine(startX, startY, endX, endY, getPaint()); - canvas.restore(); - - //画分针 - //计算角度 - degree = 360 / 60 * minutes; - radians = Math.toRadians(degree); - endX = (int) (startX + r * 0.6 * Math.cos(radians)); - endY = (int) (startY + r * 0.6 * Math.sin(radians)); - canvas.save(); - getPaint().setStrokeWidth(2); - //0 度从 3 点处开始,时间从 12 点处开始,所以需要将画布旋转 90 度 - canvas.rotate(-90, r, r); - canvas.drawLine(startX, startY, endX, endY, getPaint()); - canvas.restore(); - - //画秒针 - degree = 360 / 60 * seconds; - radians = Math.toRadians(degree); - endX = (int) (startX + r * 0.8 * Math.cos(radians)); - endY = (int) (startY + r * 0.8 * Math.sin(radians)); - canvas.save(); - getPaint().setStrokeWidth(1); - //0 度从 3 点处开始,时间从 12 点处开始,所以需要将画布旋转 90 度 - canvas.rotate(-90, r, r); - canvas.drawLine(startX, startY, endX, endY, getPaint()); - - //再给秒针画个“尾巴” - radians = Math.toRadians(degree - 180); - endX = (int) (startX + r * 0.15 * Math.cos(radians)); - endY = (int) (startY + r * 0.15 * Math.sin(radians)); - canvas.drawLine(startX, startY, endX, endY, getPaint()); - canvas.restore(); - } - - private float getRadius() { - return watchView.getRadius(); - } - - private Paint getPaint() { - Paint paint=watchView.getPaint(); - paint.setStyle(Paint.Style.STROKE); - return paint; - } - - private float getSpVal(float sp) { - return watchView.getSpVal(sp); - } - - private float getDpVal(float dp) { - return watchView.getDpVal(dp); - } - - private int getHeight() { - return watchView.getHeight(); - } - - private int getWidth() { - return watchView.getWidth(); - } -} diff --git a/app-clock/src/main/res/layout/activity_watch_view.xml b/app-clock/src/main/res/layout/activity_watch_view.xml deleted file mode 100644 index a932370..0000000 --- a/app-clock/src/main/res/layout/activity_watch_view.xml +++ /dev/null @@ -1,5 +0,0 @@ - - \ No newline at end of file diff --git a/app-clock/src/main/res/values/strings.xml b/app-clock/src/main/res/values/strings.xml deleted file mode 100644 index 89d1486..0000000 --- a/app-clock/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - MyLibrary - diff --git a/app-clock/src/test/java/cn/teachcourse/mylibrary/ExampleUnitTest.java b/app-clock/src/test/java/cn/teachcourse/mylibrary/ExampleUnitTest.java deleted file mode 100644 index 38f3545..0000000 --- a/app-clock/src/test/java/cn/teachcourse/mylibrary/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.teachcourse.mylibrary; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/app-greendao/.gitignore b/app-greendao/.gitignore deleted file mode 100644 index 7e9c84a..0000000 --- a/app-greendao/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -## 忽略指定文件夹 -/build - -## 忽略(符合正则规则)的文件 -*.iml -*.apk -*.jks - -## 忽略指定的文件 - diff --git a/app-greendao/build.gradle b/app-greendao/build.gradle deleted file mode 100644 index cfc128c..0000000 --- a/app-greendao/build.gradle +++ /dev/null @@ -1,48 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion rootProject.ext.compileSdk - buildToolsVersion rootProject.ext.buildTools - - defaultConfig { - applicationId "cn.teahcourse.greendao" - minSdkVersion 11 - targetSdkVersion 24 - versionCode 1 - versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - buildTypes { - release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - - -// 下载greenDAO插件 -buildscript { - repositories { - jcenter() -// mavenCentral() // add repository - } - dependencies { -// classpath 'com.android.tools.build:gradle:3.0.1' - classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin - } -} -// 应用greenDAO插件 -apply plugin: 'org.greenrobot.greendao' // apply plugin - -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { - exclude group: 'com.android.support', module: 'support-annotations' - }) - compile "com.android.support:appcompat-v7:$rootProject.ext.appCompat" - // 添加greenDAO依赖包 - compile 'org.greenrobot:greendao:3.2.2' -// compile 'com.android.support.constraint:constraint-layout:1.0.1' - testCompile 'junit:junit:4.12' -} diff --git a/app-greendao/proguard-rules.pro b/app-greendao/proguard-rules.pro deleted file mode 100644 index c1b8d5f..0000000 --- a/app-greendao/proguard-rules.pro +++ /dev/null @@ -1,25 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in E:\sinolvc\adt-bundle-windows-x86_64-20140702\sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/app-greendao/src/androidTest/java/cn/teahcourse/greendao/ExampleInstrumentedTest.java b/app-greendao/src/androidTest/java/cn/teahcourse/greendao/ExampleInstrumentedTest.java deleted file mode 100644 index 27aca8b..0000000 --- a/app-greendao/src/androidTest/java/cn/teahcourse/greendao/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.teahcourse.greendao; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumentation test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() throws Exception { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("cn.teahcourse.greendao", appContext.getPackageName()); - } -} diff --git a/app-greendao/src/main/AndroidManifest.xml b/app-greendao/src/main/AndroidManifest.xml deleted file mode 100644 index 5db278e..0000000 --- a/app-greendao/src/main/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app-greendao/src/main/java/cn/teahcourse/App.java b/app-greendao/src/main/java/cn/teahcourse/App.java deleted file mode 100644 index bf38f4b..0000000 --- a/app-greendao/src/main/java/cn/teahcourse/App.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.teahcourse; - -import android.app.Application; - -import org.greenrobot.greendao.database.Database; - -import cn.teahcourse.greendao.DaoMaster; -import cn.teahcourse.greendao.DaoSession; - -public class App extends Application { - /** A flag to show how easily you can switch from standard SQLite to the encrypted SQLCipher. */ - public static final boolean ENCRYPTED = false; - - private DaoSession daoSession; - - @Override - public void onCreate() { - super.onCreate(); - - DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, ENCRYPTED ? "test-db-encrypted" : "test-db"); - Database db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb(); - daoSession = new DaoMaster(db).newSession(); - } - - public DaoSession getDaoSession() { - return daoSession; - } -} diff --git a/app-greendao/src/main/java/cn/teahcourse/greendao/Course.java b/app-greendao/src/main/java/cn/teahcourse/greendao/Course.java deleted file mode 100644 index 4cc7e76..0000000 --- a/app-greendao/src/main/java/cn/teahcourse/greendao/Course.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.teahcourse.greendao; - -import org.greenrobot.greendao.annotation.Entity; -import org.greenrobot.greendao.annotation.Id; -import org.greenrobot.greendao.annotation.Index; -import org.greenrobot.greendao.annotation.NotNull; -import org.greenrobot.greendao.annotation.Generated; - -/** - * Created by http://teachcourse.cn on 2017/8/16. - */ -@Entity(indexes = { - @Index(value = "name DESC", unique = true) -}) -public class Course { - @Id - private long id; - @NotNull - private String name; - - @Generated(hash = 981929113) - public Course(long id, @NotNull String name) { - this.id = id; - this.name = name; - } - - @Generated(hash = 1355838961) - public Course() { - } - - public long getId() { - return this.id; - } - - public void setId(long id) { - this.id = id; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/app-greendao/src/main/java/cn/teahcourse/greendao/Student.java b/app-greendao/src/main/java/cn/teahcourse/greendao/Student.java deleted file mode 100644 index ca40cda..0000000 --- a/app-greendao/src/main/java/cn/teahcourse/greendao/Student.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.teahcourse.greendao; - -import org.greenrobot.greendao.annotation.Entity; -import org.greenrobot.greendao.annotation.Id; -import org.greenrobot.greendao.annotation.Index; -import org.greenrobot.greendao.annotation.NotNull; -import org.greenrobot.greendao.annotation.Generated; - -/** - * Created by http://teachcourse.cn on 2017/8/15. - */ -@Entity(indexes = { - @Index(value = "name, age,grade DESC", unique = true) -}) -public class Student { - @Id - private Long id; - - @NotNull - private String name; - @NotNull - private int age; - @NotNull - private String grade; - - @Generated(hash = 827539117) - public Student(Long id, @NotNull String name, int age, @NotNull String grade) { - this.id = id; - this.name = name; - this.age = age; - this.grade = grade; - } - - @Generated(hash = 1556870573) - public Student() { - } - - public Long getId() { - return this.id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return this.age; - } - - public void setAge(int age) { - this.age = age; - } - - public String getGrade() { - return this.grade; - } - - public void setGrade(String grade) { - this.grade = grade; - } - - @Override - public String toString() { - return "姓名:"+name+";年龄:"+age+";年级:"+grade; - } -} diff --git a/app-greendao/src/main/java/cn/teahcourse/ui/MainActivity.java b/app-greendao/src/main/java/cn/teahcourse/ui/MainActivity.java deleted file mode 100644 index 6f89c2e..0000000 --- a/app-greendao/src/main/java/cn/teahcourse/ui/MainActivity.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.teahcourse.ui; - -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; -import android.util.Log; -import android.view.View; -import android.widget.Toast; - -import org.greenrobot.greendao.query.Query; - -import java.util.List; - -import cn.teahcourse.App; -import cn.teahcourse.greendao.DaoSession; -import cn.teahcourse.greendao.R; -import cn.teahcourse.greendao.Student; -import cn.teahcourse.greendao.StudentDao; - -public class MainActivity extends AppCompatActivity { - private int number=1; - private Student student; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - } - - public void insert(View view){ - student= newStudent(); - DaoSession daoSession=((App)getApplication()).getDaoSession(); - StudentDao studentDao=daoSession.getStudentDao(); - studentDao.insert(student); - Toast.makeText(this,"添加学生信息:"+student.toString(),Toast.LENGTH_SHORT).show(); - Log.d("DaoExample", "Inserted new student, ID: " + student.getId()); - number++; - } - - public void delete(View view){ - if(student==null) - return; - DaoSession daoSession=((App)getApplication()).getDaoSession(); - StudentDao studentDao=daoSession.getStudentDao(); - studentDao.delete(student); - Toast.makeText(this,"删除学生信息:"+student.toString(),Toast.LENGTH_SHORT).show(); - Log.d("DaoExample", "Delete a student, ID: " + student.getId()); - number--; - } - - public void update(View view){ - if(student==null) - return; - student.setName("张翰"); - student.setGrade("大三"); - student.setAge(26); - DaoSession daoSession=((App)getApplication()).getDaoSession(); - StudentDao studentDao=daoSession.getStudentDao(); - studentDao.update(student); - Toast.makeText(this,"更新学生信息:"+student.toString(),Toast.LENGTH_SHORT).show(); - Log.d("DaoExample", "Update a student, ID: " + student.getId()); - number--; - } - - public void query(View view){ - DaoSession daoSession=((App)getApplication()).getDaoSession(); - StudentDao studentDao=daoSession.getStudentDao(); - Query studentQuery=studentDao.queryBuilder().orderAsc(StudentDao.Properties.Name).build(); - List studentList = studentQuery.list(); - for (Student student:studentList) { - Log.d("DaoExample", "Query students, ID: " + student.getId()); - } - } - - private Student newStudent() { - Student student=new Student(); - student.setName("张杰"+number); - student.setAge(25); - student.setGrade("大二"); - return student; - } - -} diff --git a/app-greendao/src/main/res/layout/activity_main.xml b/app-greendao/src/main/res/layout/activity_main.xml deleted file mode 100644 index 811d139..0000000 --- a/app-greendao/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,30 +0,0 @@ - - -