From e39ae9f062636361f38692ebbdff485cc1f6ba53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=BD=B3=E4=BA=AE?= Date: Thu, 7 May 2020 15:02:30 +0800 Subject: [PATCH 01/11] Upgrade configuration to target api 29. current configuration is too low , can't run on android studio --- app/build.gradle | 22 +++++++++------------- build.gradle | 25 ++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bf31fe2..ba37e86 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,11 +1,4 @@ -buildscript { - repositories { - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:0.7.+' - } -} + apply plugin: 'android' repositories { @@ -13,23 +6,26 @@ repositories { } android { - compileSdkVersion 19 - buildToolsVersion "19.0.0" + compileSdkVersion 29 + buildToolsVersion "29.0.2" + + lintOptions { + abortOnError false + } defaultConfig { minSdkVersion 17 - targetSdkVersion 19 + targetSdkVersion 29 versionCode 1 versionName "1.0" } buildTypes { release { - runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } dependencies { - compile 'com.android.support:support-v4:13.0.0' + compile 'com.android.support:support-v4:27.0.0' } diff --git a/build.gradle b/build.gradle index f7a7ae7..53be684 100644 --- a/build.gradle +++ b/build.gradle @@ -1 +1,24 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. \ No newline at end of file +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + + } + dependencies { + classpath 'com.android.tools.build:gradle:3.5.3' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + + } +} \ No newline at end of file From edb379dce9ae2d637d6220388d65d949810a3a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=BD=B3=E4=BA=AE?= Date: Thu, 7 May 2020 15:12:55 +0800 Subject: [PATCH 02/11] Upgrade gradle version. old gradle url is response 404. --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9b8ffdd..c154862 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-1.9-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip From 5e73ceb6f0b103f3daa236ba645c5070abb294b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=BD=B3=E4=BA=AE?= Date: Sun, 17 May 2020 22:48:28 +0800 Subject: [PATCH 03/11] 1. add corner mark number span --- .../spanimated/CornerMarkSpan.java | 88 ++++++++++++++++++ .../spanimated/MainActivity.java | 19 ++++ .../res/drawable-mdpi/corner_drawbale.9.png | Bin 0 -> 2754 bytes app/src/main/res/layout/activity_main.xml | 7 ++ 4 files changed, 114 insertions(+) create mode 100644 app/src/main/java/com/flavienlaurent/spanimated/CornerMarkSpan.java create mode 100644 app/src/main/res/drawable-mdpi/corner_drawbale.9.png diff --git a/app/src/main/java/com/flavienlaurent/spanimated/CornerMarkSpan.java b/app/src/main/java/com/flavienlaurent/spanimated/CornerMarkSpan.java new file mode 100644 index 0000000..cc874b9 --- /dev/null +++ b/app/src/main/java/com/flavienlaurent/spanimated/CornerMarkSpan.java @@ -0,0 +1,88 @@ +package com.flavienlaurent.spanimated; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.text.TextPaint; +import android.text.TextUtils; +import android.text.style.ReplacementSpan; + +/** + */ +public class CornerMarkSpan extends ReplacementSpan { + + private final int cornerHeight; + private final int cornerWidth; + private TextPaint mCornerPaint; + private Paint mTextPaint; + private int mWidth; + private String text = ""; + + private Drawable cornerDrawable; + private Rect mCornerBound; + private Context mContext; + + public CornerMarkSpan(Context context, Paint textPaint) { + mContext = context; + mTextPaint = textPaint; + + mCornerPaint = new TextPaint(); + mCornerPaint.setStyle(Paint.Style.FILL); + mCornerPaint.setColor(Color.WHITE); + mCornerPaint.setTextSize(mTextPaint.getTextSize() * 0.5f); + mCornerPaint.setAntiAlias(true); + + cornerDrawable = context.getResources().getDrawable(R.drawable.corner_drawbale); + + cornerHeight = dp2px(context, 15); + cornerWidth = dp2px(context, 15); + + mCornerBound = new Rect(0, 0, cornerWidth, cornerHeight); + cornerDrawable.setBounds(mCornerBound); + } + + /** + * dp转px + */ + public static int dp2px(Context context, float dp) { + return (int) (dp * context.getResources().getDisplayMetrics().density + 0.5f); + } + + + @Override + public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { + //return text with relative to the Paint + mWidth = (int) paint.measureText(text, start, end); + if (text == null) { + text = ""; + } + this.text = text.toString(); + return mWidth; + } + + @Override + public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { + //draw the frame with custom Paint +// float halfHeight = (bottom - top) / 2f; +// canvas.drawCircle(x, top + halfHeight, halfHeight, mPaint); + if (!TextUtils.isEmpty(this.text)) { + canvas.drawText(text, start, end, x, y, mTextPaint); + } + + canvas.save(); + canvas.translate(x, top - cornerHeight); + cornerDrawable.draw(canvas); + canvas.restore(); + + canvas.save(); + canvas.translate(0, -cornerHeight - dp2px(mContext, 4)); + canvas.drawText("12", 0, 2, x, y, mCornerPaint); + canvas.restore(); + + +// canvas.drawRect(x, top, x + mWidth, bottom, mPaint); + } +} diff --git a/app/src/main/java/com/flavienlaurent/spanimated/MainActivity.java b/app/src/main/java/com/flavienlaurent/spanimated/MainActivity.java index 2b66fe9..c62c2e7 100644 --- a/app/src/main/java/com/flavienlaurent/spanimated/MainActivity.java +++ b/app/src/main/java/com/flavienlaurent/spanimated/MainActivity.java @@ -58,6 +58,7 @@ public class MainActivity extends Activity { private Button mBtnDraw1; private Button mBtnDraw2; private Button mBtnDraw3; + private Button mBtnDrawCornMark; private Button mBtnAnimateTypeWriter; private Button mBtnViewPager; private Button mBtnAnimateAb1; @@ -87,6 +88,7 @@ protected void onCreate(Bundle savedInstanceState) { mBtnDraw1 = (Button) findViewById(R.id.btn_draw1); mBtnDraw2 = (Button) findViewById(R.id.btn_draw2); mBtnDraw3 = (Button) findViewById(R.id.btn_draw3); + mBtnDrawCornMark = (Button) findViewById(R.id.btn_corner_mark); mBtnAnimateTypeWriter = (Button) findViewById(R.id.btn_animate_typewriter); mBtnReset = (Button) findViewById(R.id.btn_reset); mBtnViewPager = (Button) findViewById(R.id.btn_viewpager); @@ -121,6 +123,13 @@ public void onClick(View v) { } }); + mBtnDrawCornMark.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + reset(); + drawingCornerMarkSpan(); + } + }); mBtnDraw2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -364,6 +373,16 @@ private void drawingSpan1() { mText.setText(mBaconIpsumSpannableString); } + private void drawingCornerMarkSpan() { + CornerMarkSpan cornerMarkSpan = new CornerMarkSpan(this, mText.getPaint()); + mSpans.add(cornerMarkSpan); + + WordPosition wordPosition = getWordPosition(mBaconIpsum); + mBaconIpsumSpannableString.setSpan(cornerMarkSpan, wordPosition.start, wordPosition.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + //refresh + mText.setText(mBaconIpsumSpannableString); + } + private void animateTypeWriter() { TypeWriterSpanGroup spanGroup = buildTypeWriterSpanGroup(0, mBaconIpsum.length() - 1); ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(spanGroup, TYPE_WRITER_GROUP_ALPHA_PROPERTY, 0.0f, 1.0f); diff --git a/app/src/main/res/drawable-mdpi/corner_drawbale.9.png b/app/src/main/res/drawable-mdpi/corner_drawbale.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9818625c629b3b0cc1f0e1269dca2b3a4ba3a3bd GIT binary patch literal 2754 zcmV;z3O)6SP)IEI z%B@UU7Sz*pmhGr#uypccY~B2s{1F9LI$f9dSfv&<;qpXU5XcN~O(6)NXjFdd!cQ_? zx{Rsv*O@Ng%yi{$rYS#ThWuNmNgeRqDrQKn@O(2ghR)t-eZuKm0*^qaTks zK!x%mSp5T5pmEb|_?wz*38cQ{hVaZvX){~EJ`I0nOVxt(&f%fGv$_`D%{m))))qi{XS025#d!(ePw}kXl%59X7{3{Oik<|07{7ZAUrSU990fT8O{}` z-BeGw=O{SvmYSI;6{P2v@N9M>Lkh1TGtn}4St+@`Qb6kCM2*gc%`T)5l2UVhE6!Ws zH+$|EqztEBwarVw5BWPOIS|=rUvsPs0;Fx6lhD&t&$(=*+~BS`@IK1AIBc#2q#Q3! zS8fc6RyCd7-XK$xKeVsnTgw3{N1k7!e3ltgw&hWLG33^i zVNz&V^fCDXFJ7M;NWFQ?(vAh^zz01_$_$x>q|5V)@%jou$|uhwyR*_StM|?e~{4Zc(ns5FH*s>o5}T2ML^P(OW;jA zNO6(N054?o1(KnBvkI#oYC#V164Ct9P#2Ka-836OT1IIgVL3g$Ab>F4_alQsZ-Md* zHxy5h)azyentvl@3A}4Um*)wRk(^_dAdM0lp#8R^Fq*$K}+yvB2T#UefQbCzaB zEXk06P07_5l*{nOir39@0f}GsEhUiR;O?YWJL}+fPLggd=)6cGMphLEsY|*6UNA~Z z622#`E)G&>@+Kb_A5mJ^gIZ!+cK0(w^UCuOR zFDXl4ISlqo_XG*AZgpuRDN9&nx5b;|kWCNakPcFq2sy!dURd~jrJP00n%x;#FAh!hujMS9Pd>-~XbWyBRQJ#u-` z$r$K-MM1@%IrS(mU4ERD7vUi`M?moj62AnLZlQ#0Wcj)+e9%`(An`L(;`0!Pl41jthZ3zgHPr6ZX;uzWI(asH@DrrmfJ9C3siD|!-B+VrU#p|(9CCL7 zNoRsj4RzatyxM!V`LZPHe-{8i4TCeg8}Aw!8{JV(^Y->B_ay4vRVhFRah&+>!$W&3 z8H3Q~ZApAyIVroWJ?L6KH5A9Y1~E{?9VpBz5lCeM)PPe%_v3iiAV>4Gle-HHAby#L z<6XlTa+PmU8+Zs#x3r}J#HWVhc-Jt;#kChSa$ir%_wVA6c#q>8n0=vTeebkg2YRq(ui!fq{WFc! z9XQ@q_<;I7qr;D|d)P%xm2O~K>bndZj_cC(oWHCp-?K<7Aow*thu>3ExA5nT#dBB} zuOi%4Q{3&&L@!={9~wKl!wh&;GO@YYIi)18`z}78{T|-g=Y0=(e0bhM@FpU~>a{HF zOSfj>@0M8E?2H-0s&w{wJ1ci#Sw|mlk#h&gU#pBRcG7a=N;4lu3IB*wT{j3FQ12^y zKGo71FST9d&MIKa4lzyEctetOQ@u^Q>N7)JL4XttP)Ks&Oj+39@H!-JMFNJr-Kxk} zE@A7EpK)XL#2uu{Twfvge4?6zm)*QBsE`faFODU8lo`r>tV2GZr^WJlaofxYR*)bC zV^NbzLK`pO6^FbuRN814TOSE+pV8zu!CIbz$9t^#QFgQ10_txR78Djp!C6#cX(%cQ zqeQHV$Myx-XF`)7W`^{Fy^pA@lLV~W=DV0CEoN&M zUCdqY0n#U2v-;&1#eMq`xi!sysnqG*tyVZS_S7ZJ#{N5aB>ip!hvUCI?ql`rBIbqI)qgY5xMT~sbE3XsAFYAQFGJ*%N0s3_U}B!BFUKV!C{ zxL#Ah3KOJoT%VwoCC}F)NMbE27;qvD5-R82g`k6JC}pkx0|!ck @@ -62,6 +63,12 @@ android:layout_height="wrap_content" android:text="draw with span 1"/> +