diff --git a/SignaturePad-Example/build.gradle b/SignaturePad-Example/build.gradle index f083098..08a476f 100644 --- a/SignaturePad-Example/build.gradle +++ b/SignaturePad-Example/build.gradle @@ -4,8 +4,9 @@ android { compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION - defaultConfig { - minSdkVersion 9 + + defaultConfig { + minSdkVersion 14 targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION) versionName project.VERSION_NAME versionCode Integer.parseInt(project.VERSION_CODE) @@ -21,6 +22,6 @@ android { } dependencies { - compile project(":signature-pad") - compile 'com.android.support:appcompat-v7:25.3.1' + implementation project(":signature-pad") + implementation 'com.android.support:appcompat-v7:26.0.1' } diff --git a/build.gradle b/build.gradle index 7ab33fb..7f50c4e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,13 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' + classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0' } } @@ -16,5 +17,6 @@ allprojects { repositories { jcenter() + google() } } diff --git a/gradle.properties b/gradle.properties index 2bf023c..43aa36d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -33,6 +33,6 @@ POM_LICENCE_DIST=repo POM_DEVELOPER_ID=gcacace POM_DEVELOPER_NAME=Gianluca Cacace -ANDROID_BUILD_TARGET_SDK_VERSION=25 -ANDROID_BUILD_TOOLS_VERSION=25.0.3 -ANDROID_BUILD_SDK_VERSION=25 +ANDROID_BUILD_TARGET_SDK_VERSION=26 +ANDROID_BUILD_TOOLS_VERSION=26.0.2 +ANDROID_BUILD_SDK_VERSION=26 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 357b148..9112b02 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Aug 08 11:36:01 SGT 2017 +#Wed May 09 13:17:36 CEST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/signature-pad/build.gradle b/signature-pad/build.gradle index 17075bf..14daa1e 100644 --- a/signature-pad/build.gradle +++ b/signature-pad/build.gradle @@ -14,8 +14,9 @@ android { compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION + defaultConfig { - minSdkVersion 9 + minSdkVersion 14 targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION) } diff --git a/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/Bezier.java b/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/Bezier.java index 3d29c38..d82abdf 100644 --- a/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/Bezier.java +++ b/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/Bezier.java @@ -39,7 +39,7 @@ public float length() { } - public double point(float t, float start, float c1, float c2, float end) { + private double point(float t, float start, float c1, float c2, float end) { return start * (1.0 - t) * (1.0 - t) * (1.0 - t) + 3.0 * c1 * (1.0 - t) * (1.0 - t) * t + 3.0 * c2 * (1.0 - t) * t * t diff --git a/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/SvgPathBuilder.java b/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/SvgPathBuilder.java index f48eff8..ff593b6 100644 --- a/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/SvgPathBuilder.java +++ b/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/SvgPathBuilder.java @@ -8,14 +8,14 @@ */ public class SvgPathBuilder { - public static final Character SVG_RELATIVE_CUBIC_BEZIER_CURVE = 'c'; - public static final Character SVG_MOVE = 'M'; + private static final Character SVG_RELATIVE_CUBIC_BEZIER_CURVE = 'c'; + private static final Character SVG_MOVE = 'M'; private final StringBuilder mStringBuilder; private final Integer mStrokeWidth; private final SvgPoint mStartPoint; private SvgPoint mLastPoint; - public SvgPathBuilder(final SvgPoint startPoint, final Integer strokeWidth) { + SvgPathBuilder(final SvgPoint startPoint, final Integer strokeWidth) { mStrokeWidth = strokeWidth; mStartPoint = startPoint; mLastPoint = startPoint; @@ -57,16 +57,8 @@ private String makeRelativeCubicBezierCurve(final SvgPoint controlPoint1, final final String sControlPoint2 = controlPoint2.toRelativeCoordinates(mLastPoint); final String sEndPoint = endPoint.toRelativeCoordinates(mLastPoint); - final StringBuilder sb = new StringBuilder(); - sb.append(sControlPoint1); - sb.append(" "); - sb.append(sControlPoint2); - sb.append(" "); - sb.append(sEndPoint); - sb.append(" "); - // discard zero curve - final String svg = sb.toString(); + final String svg = sControlPoint1 + " " + sControlPoint2 + " " + sEndPoint + " "; if ("c0 0 0 0 0 0".equals(svg)) { return ""; } else { diff --git a/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/SvgPoint.java b/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/SvgPoint.java index 6afe0db..7b84e75 100644 --- a/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/SvgPoint.java +++ b/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/SvgPoint.java @@ -5,26 +5,22 @@ */ class SvgPoint { - final Integer x, y; + private final Integer x, y; - public SvgPoint(TimedPoint point) { + SvgPoint(TimedPoint point) { // one optimisation is to get rid of decimals as they are mostly non-significant in the // produced SVG image x = Math.round(point.x); y = Math.round(point.y); } - public SvgPoint(int x, int y) { + private SvgPoint(int x, int y) { this.x = x; this.y = y; } - public String toAbsoluteCoordinates() { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(x); - stringBuilder.append(","); - stringBuilder.append(y); - return stringBuilder.toString(); + private String toAbsoluteCoordinates() { + return String.valueOf(x) + "," + y; } public String toRelativeCoordinates(final SvgPoint referencePoint) { @@ -43,8 +39,7 @@ public boolean equals(Object o) { SvgPoint svgPoint = (SvgPoint) o; - if (!x.equals(svgPoint.x)) return false; - return y.equals(svgPoint.y); + return x.equals(svgPoint.x) && y.equals(svgPoint.y); } diff --git a/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/TimedPoint.java b/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/TimedPoint.java index ea48484..ec9b34f 100644 --- a/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/TimedPoint.java +++ b/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/TimedPoint.java @@ -3,7 +3,7 @@ public class TimedPoint { public float x; public float y; - public long timestamp; + private long timestamp; public TimedPoint set(float x, float y) { this.x = x; @@ -24,7 +24,7 @@ public float velocityFrom(TimedPoint start) { return velocity; } - public float distanceTo(TimedPoint point) { - return (float) Math.sqrt(Math.pow(point.x - this.x, 2) + Math.pow(point.y - this.y, 2)); + private float distanceTo(TimedPoint point) { + return (float) Math.hypot(point.x - this.x, point.y - this.y); } } diff --git a/signature-pad/src/main/java/com/github/gcacace/signaturepad/views/SignaturePad.java b/signature-pad/src/main/java/com/github/gcacace/signaturepad/views/SignaturePad.java index db012a2..1941906 100644 --- a/signature-pad/src/main/java/com/github/gcacace/signaturepad/views/SignaturePad.java +++ b/signature-pad/src/main/java/com/github/gcacace/signaturepad/views/SignaturePad.java @@ -1,6 +1,7 @@ package com.github.gcacace.signaturepad.views; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; @@ -27,6 +28,10 @@ import java.util.ArrayList; import java.util.List; +import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; +import static android.content.res.Configuration.ORIENTATION_PORTRAIT; +import static android.content.res.Configuration.ORIENTATION_UNDEFINED; + public class SignaturePad extends View { //View state private List mPoints; @@ -79,11 +84,15 @@ public SignaturePad(Context context, AttributeSet attrs) { //Configurable parameters try { - mMinWidth = a.getDimensionPixelSize(R.styleable.SignaturePad_penMinWidth, convertDpToPx(DEFAULT_ATTR_PEN_MIN_WIDTH_PX)); - mMaxWidth = a.getDimensionPixelSize(R.styleable.SignaturePad_penMaxWidth, convertDpToPx(DEFAULT_ATTR_PEN_MAX_WIDTH_PX)); + mMinWidth = a.getDimensionPixelSize(R.styleable.SignaturePad_penMinWidth, + convertDpToPx(DEFAULT_ATTR_PEN_MIN_WIDTH_PX)); + mMaxWidth = a.getDimensionPixelSize(R.styleable.SignaturePad_penMaxWidth, + convertDpToPx(DEFAULT_ATTR_PEN_MAX_WIDTH_PX)); mPaint.setColor(a.getColor(R.styleable.SignaturePad_penColor, DEFAULT_ATTR_PEN_COLOR)); - mVelocityFilterWeight = a.getFloat(R.styleable.SignaturePad_velocityFilterWeight, DEFAULT_ATTR_VELOCITY_FILTER_WEIGHT); - mClearOnDoubleClick = a.getBoolean(R.styleable.SignaturePad_clearOnDoubleClick, DEFAULT_ATTR_CLEAR_ON_DOUBLE_CLICK); + mVelocityFilterWeight = a.getFloat(R.styleable.SignaturePad_velocityFilterWeight, + DEFAULT_ATTR_VELOCITY_FILTER_WEIGHT); + mClearOnDoubleClick = a.getBoolean(R.styleable.SignaturePad_clearOnDoubleClick, + DEFAULT_ATTR_CLEAR_ON_DOUBLE_CLICK); } finally { a.recycle(); } @@ -97,6 +106,8 @@ public SignaturePad(Context context, AttributeSet attrs) { //Dirty rectangle to update only the changed portion of the view mDirtyRect = new RectF(); +// this.orientation = context.getResources().getConfiguration().orientation; + clearView(); } @@ -135,7 +146,7 @@ public void setPenColorRes(int colorRes) { try { setPenColor(getResources().getColor(colorRes)); } catch (Resources.NotFoundException ex) { - setPenColor(Color.parseColor("#000000")); + setPenColor(Color.BLACK); } } @@ -247,6 +258,15 @@ protected void onDraw(Canvas canvas) { } } + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + ensureSignatureBitmap(); + float scale = Math.min((float) w / mSignatureBitmap.getWidth(), (float) h / mSignatureBitmap.getHeight()); + mSignatureBitmap = Bitmap.createScaledBitmap(mSignatureBitmap, (int)(w * scale), (int)(h * scale), true); + mSignatureBitmapCanvas = new Canvas(mSignatureBitmap); + } + public void setOnSignedListener(OnSignedListener listener) { mOnSignedListener = listener; } @@ -263,7 +283,8 @@ public String getSignatureSvg() { public Bitmap getSignatureBitmap() { Bitmap originalBitmap = getTransparentSignatureBitmap(); - Bitmap whiteBgBitmap = Bitmap.createBitmap(originalBitmap.getWidth(), originalBitmap.getHeight(), Bitmap.Config.ARGB_8888); + Bitmap whiteBgBitmap = Bitmap.createBitmap( + originalBitmap.getWidth(), originalBitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(whiteBgBitmap); canvas.drawColor(Color.WHITE); canvas.drawBitmap(originalBitmap, 0, 0, null); @@ -550,7 +571,10 @@ private ControlTimedPoints calculateCurveControlPoints(TimedPoint s1, TimedPoint float tx = s2.x - cmX; float ty = s2.y - cmY; - return mControlTimedPointsCached.set(getNewPoint(m1X + tx, m1Y + ty), getNewPoint(m2X + tx, m2Y + ty)); + return mControlTimedPointsCached.set( + getNewPoint(m1X + tx, m1Y + ty), + getNewPoint(m2X + tx, m2Y + ty) + ); } private float strokeWidth(float velocity) {