From e14a7210310cc4f09ab4a2ba14a4e0e25be79928 Mon Sep 17 00:00:00 2001 From: "Michele Tagliabue (dal fornello)" Date: Sat, 1 Sep 2018 20:20:56 +0200 Subject: [PATCH 1/7] =?UTF-8?q?Aggiunto=20sensibilit=C3=A0=20alla=20pressi?= =?UTF-8?q?one?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SignaturePad-Example/build.gradle | 10 +++++----- build.gradle | 7 +++++-- gradle/wrapper/gradle-wrapper.properties | 4 ++-- signature-pad/build.gradle | 7 +++---- .../gcacace/signaturepad/views/SignaturePad.java | 10 +++++----- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/SignaturePad-Example/build.gradle b/SignaturePad-Example/build.gradle index f083098..0c0ef30 100644 --- a/SignaturePad-Example/build.gradle +++ b/SignaturePad-Example/build.gradle @@ -2,10 +2,9 @@ apply plugin: 'com.android.application' android { compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) - buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION - defaultConfig { - minSdkVersion 9 + defaultConfig { + minSdkVersion 15 targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION) versionName project.VERSION_NAME versionCode Integer.parseInt(project.VERSION_CODE) @@ -18,9 +17,10 @@ android { minifyEnabled false } } + buildToolsVersion '27.0.3' } dependencies { - compile project(":signature-pad") - compile 'com.android.support:appcompat-v7:25.3.1' + implementation project(":signature-pad") + implementation 'com.android.support:appcompat-v7:27.1.1' } diff --git a/build.gradle b/build.gradle index 7ab33fb..55f237b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,14 @@ 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.android.tools.build:gradle:3.1.4' + classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' + classpath 'com.android.tools.build:gradle:3.3.0-alpha07' } } @@ -16,5 +18,6 @@ allprojects { repositories { jcenter() + google() } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 357b148..7765dcc 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 +#Thu Aug 30 09:23:55 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.9-all.zip diff --git a/signature-pad/build.gradle b/signature-pad/build.gradle index 17075bf..931ba3b 100644 --- a/signature-pad/build.gradle +++ b/signature-pad/build.gradle @@ -3,7 +3,6 @@ apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' dependencies { - } Properties properties = new Properties() @@ -11,17 +10,17 @@ final def bintrayPropertiesFile = project.rootProject.file('bintray.properties') if (bintrayPropertiesFile.exists()) properties.load(bintrayPropertiesFile.newDataInputStream()) android { - compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) - buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION + compileSdkVersion 27 defaultConfig { - minSdkVersion 9 + minSdkVersion 15 targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION) } dataBinding { enabled = true } + buildToolsVersion '27.0.3' } bintray { 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..4f2d1e2 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 @@ -211,17 +211,17 @@ public boolean onTouchEvent(MotionEvent event) { if (isDoubleClick()) break; mLastTouchX = eventX; mLastTouchY = eventY; - addPoint(getNewPoint(eventX, eventY)); + addPoint(getNewPoint(eventX, eventY),event.getPressure()); if(mOnSignedListener != null) mOnSignedListener.onStartSigning(); case MotionEvent.ACTION_MOVE: resetDirtyRect(eventX, eventY); - addPoint(getNewPoint(eventX, eventY)); + addPoint(getNewPoint(eventX, eventY),event.getPressure()); break; case MotionEvent.ACTION_UP: resetDirtyRect(eventX, eventY); - addPoint(getNewPoint(eventX, eventY)); + addPoint(getNewPoint(eventX, eventY),event.getPressure()); getParent().requestDisallowInterceptTouchEvent(true); setIsEmpty(false); break; @@ -437,7 +437,7 @@ private void recyclePoint(TimedPoint point) { mPointsCache.add(point); } - private void addPoint(TimedPoint newPoint) { + private void addPoint(TimedPoint newPoint, float pressure) { mPoints.add(newPoint); int pointsCount = mPoints.size(); @@ -464,7 +464,7 @@ private void addPoint(TimedPoint newPoint) { // The new width is a function of the velocity. Higher velocities // correspond to thinner strokes. - float newWidth = strokeWidth(velocity); + float newWidth = mMaxWidth * pressure;//strokeWidth(velocity); // The Bezier's width starts out as last curve's final width, and // gradually changes to the stroke width just calculated. The new From 603af4d3a0a2e658978e3d117c83cd538ab0e08a Mon Sep 17 00:00:00 2001 From: Michele Tagliabue Date: Sat, 1 Sep 2018 20:31:43 +0200 Subject: [PATCH 2/7] Fix errori linking resources --- gradle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 2bf023c..3f0f6db 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=27 +ANDROID_BUILD_TOOLS_VERSION=27.0.3 +ANDROID_BUILD_SDK_VERSION=27 From 8b0a529eba2cb0a051313c8893aec9c11dba9bf2 Mon Sep 17 00:00:00 2001 From: Michele Tagliabue Date: Sat, 1 Sep 2018 20:46:55 +0200 Subject: [PATCH 3/7] Sistemati certi parametri --- .../gcacace/signaturepad/views/SignaturePad.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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 4f2d1e2..3d3818f 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 @@ -60,9 +60,9 @@ public class SignaturePad extends View { //Default attribute values private final int DEFAULT_ATTR_PEN_MIN_WIDTH_PX = 3; - private final int DEFAULT_ATTR_PEN_MAX_WIDTH_PX = 7; + private final int DEFAULT_ATTR_PEN_MAX_WIDTH_PX = 10; private final int DEFAULT_ATTR_PEN_COLOR = Color.BLACK; - private final float DEFAULT_ATTR_VELOCITY_FILTER_WEIGHT = 0.9f; + private final float DEFAULT_ATTR_VELOCITY_FILTER_WEIGHT = 0.3f; private final boolean DEFAULT_ATTR_CLEAR_ON_DOUBLE_CLICK = false; private Paint mPaint = new Paint(); @@ -464,7 +464,7 @@ private void addPoint(TimedPoint newPoint, float pressure) { // The new width is a function of the velocity. Higher velocities // correspond to thinner strokes. - float newWidth = mMaxWidth * pressure;//strokeWidth(velocity); + float newWidth = strokeWidth(velocity, pressure); // The Bezier's width starts out as last curve's final width, and // gradually changes to the stroke width just calculated. The new @@ -553,8 +553,9 @@ private ControlTimedPoints calculateCurveControlPoints(TimedPoint s1, TimedPoint return mControlTimedPointsCached.set(getNewPoint(m1X + tx, m1Y + ty), getNewPoint(m2X + tx, m2Y + ty)); } - private float strokeWidth(float velocity) { - return Math.max(mMaxWidth / (velocity + 1), mMinWidth); + private float strokeWidth(float velocity, float pressure) { + float velocityWidth = Math.max(mMaxWidth / (velocity + 1), mMinWidth); + return Math.max(velocityWidth*pressure,mMinWidth); } /** From 5c66a92c0265a8d62e5c3af1932b515d522bad7d Mon Sep 17 00:00:00 2001 From: Michele Tagliabue Date: Sat, 1 Sep 2018 20:58:26 +0200 Subject: [PATCH 4/7] fix per pull request --- signature-pad/build.gradle | 2 +- .../com/github/gcacace/signaturepad/views/SignaturePad.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/signature-pad/build.gradle b/signature-pad/build.gradle index 931ba3b..e9c8952 100644 --- a/signature-pad/build.gradle +++ b/signature-pad/build.gradle @@ -13,7 +13,7 @@ android { compileSdkVersion 27 defaultConfig { - minSdkVersion 15 + minSdkVersion 9 targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION) } 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 3d3818f..b4f2a35 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 @@ -211,17 +211,17 @@ public boolean onTouchEvent(MotionEvent event) { if (isDoubleClick()) break; mLastTouchX = eventX; mLastTouchY = eventY; - addPoint(getNewPoint(eventX, eventY),event.getPressure()); + addPoint(getNewPoint(eventX, eventY), event.getPressure()); if(mOnSignedListener != null) mOnSignedListener.onStartSigning(); case MotionEvent.ACTION_MOVE: resetDirtyRect(eventX, eventY); - addPoint(getNewPoint(eventX, eventY),event.getPressure()); + addPoint(getNewPoint(eventX, eventY), event.getPressure()); break; case MotionEvent.ACTION_UP: resetDirtyRect(eventX, eventY); - addPoint(getNewPoint(eventX, eventY),event.getPressure()); + addPoint(getNewPoint(eventX, eventY), event.getPressure()); getParent().requestDisallowInterceptTouchEvent(true); setIsEmpty(false); break; From 848902120342940d67c9ee3470606f929f818de6 Mon Sep 17 00:00:00 2001 From: Michele Tagliabue Date: Sat, 1 Sep 2018 21:02:37 +0200 Subject: [PATCH 5/7] Decrementato il min sdk anche dell'app di prova. E' richiesto il 14 a causa delle nuove librerie appcompat --- SignaturePad-Example/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SignaturePad-Example/build.gradle b/SignaturePad-Example/build.gradle index 0c0ef30..d1319f2 100644 --- a/SignaturePad-Example/build.gradle +++ b/SignaturePad-Example/build.gradle @@ -4,7 +4,7 @@ android { compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) defaultConfig { - minSdkVersion 15 + minSdkVersion 14 targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION) versionName project.VERSION_NAME versionCode Integer.parseInt(project.VERSION_CODE) From 201fa93d575a136a37fd19fde9fe95dc8cdd5b48 Mon Sep 17 00:00:00 2001 From: Michele Tagliabue Date: Sat, 1 Sep 2018 21:18:02 +0200 Subject: [PATCH 6/7] patch for TransactionTooLargeException --- .../com/github/gcacace/signaturepad/views/SignaturePad.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 b4f2a35..dbdfb14 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 @@ -101,6 +101,7 @@ public SignaturePad(Context context, AttributeSet attrs) { } + /* @Override protected Parcelable onSaveInstanceState() { Bundle bundle = new Bundle(); @@ -110,7 +111,7 @@ protected Parcelable onSaveInstanceState() { } bundle.putParcelable("signatureBitmap", this.mBitmapSavedState); return bundle; - } + }*/ @Override protected void onRestoreInstanceState(Parcelable state) { From 08efa3c2471ba77b925ba659acc4aa816820e4a9 Mon Sep 17 00:00:00 2001 From: Michele Tagliabue Date: Sun, 16 Sep 2018 13:51:19 +0200 Subject: [PATCH 7/7] Cose --- .../gcacace/signaturepad/MainActivity.java | 36 ------------- .../signaturepad/utils/BitmapUtils.java | 51 +++++++++++++++++++ .../signaturepad/views/SignaturePad.java | 11 ++++ 3 files changed, 62 insertions(+), 36 deletions(-) create mode 100644 signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/BitmapUtils.java diff --git a/SignaturePad-Example/src/main/java/com/github/gcacace/signaturepad/MainActivity.java b/SignaturePad-Example/src/main/java/com/github/gcacace/signaturepad/MainActivity.java index 4892e17..ad1f511 100644 --- a/SignaturePad-Example/src/main/java/com/github/gcacace/signaturepad/MainActivity.java +++ b/SignaturePad-Example/src/main/java/com/github/gcacace/signaturepad/MainActivity.java @@ -103,45 +103,9 @@ public void onRequestPermissionsResult(int requestCode, } } - public File getAlbumStorageDir(String albumName) { - // Get the directory for the user's public pictures directory. - File file = new File(Environment.getExternalStoragePublicDirectory( - Environment.DIRECTORY_PICTURES), albumName); - if (!file.mkdirs()) { - Log.e("SignaturePad", "Directory not created"); - } - return file; - } - public void saveBitmapToJPG(Bitmap bitmap, File photo) throws IOException { - Bitmap newBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(newBitmap); - canvas.drawColor(Color.WHITE); - canvas.drawBitmap(bitmap, 0, 0, null); - OutputStream stream = new FileOutputStream(photo); - newBitmap.compress(Bitmap.CompressFormat.JPEG, 80, stream); - stream.close(); - } - public boolean addJpgSignatureToGallery(Bitmap signature) { - boolean result = false; - try { - File photo = new File(getAlbumStorageDir("SignaturePad"), String.format("Signature_%d.jpg", System.currentTimeMillis())); - saveBitmapToJPG(signature, photo); - scanMediaFile(photo); - result = true; - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - private void scanMediaFile(File photo) { - Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); - Uri contentUri = Uri.fromFile(photo); - mediaScanIntent.setData(contentUri); - MainActivity.this.sendBroadcast(mediaScanIntent); - } public boolean addSvgSignatureToGallery(String signatureSvg) { boolean result = false; diff --git a/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/BitmapUtils.java b/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/BitmapUtils.java new file mode 100644 index 0000000..d095e0c --- /dev/null +++ b/signature-pad/src/main/java/com/github/gcacace/signaturepad/utils/BitmapUtils.java @@ -0,0 +1,51 @@ +package com.github.gcacace.signaturepad.utils; + +import android.graphics.Bitmap; +import android.graphics.Color; + +public class BitmapUtils { + public static Bitmap trim(Bitmap source) { + int firstX = 0, firstY = 0; + int lastX = source.getWidth(); + int lastY = source.getHeight(); + int[] pixels = new int[source.getWidth() * source.getHeight()]; + source.getPixels(pixels, 0, source.getWidth(), 0, 0, source.getWidth(), source.getHeight()); + loop: + for (int x = 0; x < source.getWidth(); x++) { + for (int y = 0; y < source.getHeight(); y++) { + if (pixels[x + (y * source.getWidth())] != Color.TRANSPARENT) { + firstX = x; + break loop; + } + } + } + loop: + for (int y = 0; y < source.getHeight(); y++) { + for (int x = firstX; x < source.getWidth(); x++) { + if (pixels[x + (y * source.getWidth())] != Color.TRANSPARENT) { + firstY = y; + break loop; + } + } + } + loop: + for (int x = source.getWidth() - 1; x >= firstX; x--) { + for (int y = source.getHeight() - 1; y >= firstY; y--) { + if (pixels[x + (y * source.getWidth())] != Color.TRANSPARENT) { + lastX = x; + break loop; + } + } + } + loop: + for (int y = source.getHeight() - 1; y >= firstY; y--) { + for (int x = source.getWidth() - 1; x >= firstX; x--) { + if (pixels[x + (y * source.getWidth())] != Color.TRANSPARENT) { + lastY = y; + break loop; + } + } + } + return Bitmap.createBitmap(source, firstX, firstY, lastX - firstX, lastY - firstY); + } +} 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 dbdfb14..df9d16d 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 @@ -18,6 +18,7 @@ import com.github.gcacace.signaturepad.R; import com.github.gcacace.signaturepad.utils.Bezier; +import com.github.gcacace.signaturepad.utils.BitmapUtils; import com.github.gcacace.signaturepad.utils.ControlTimedPoints; import com.github.gcacace.signaturepad.utils.SvgBuilder; import com.github.gcacace.signaturepad.utils.TimedPoint; @@ -271,6 +272,16 @@ public Bitmap getSignatureBitmap() { return whiteBgBitmap; } + public Bitmap getTrimmedSignatureBitmap(boolean transparent) { + Bitmap originalBitmap = BitmapUtils.trim(getTransparentSignatureBitmap()); + + Bitmap whiteBgBitmap = Bitmap.createBitmap(originalBitmap.getWidth(), originalBitmap.getHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(whiteBgBitmap); + canvas.drawColor(transparent ? Color.TRANSPARENT : Color.WHITE); + canvas.drawBitmap(originalBitmap, 0, 0, null); + return whiteBgBitmap; + } + public void setSignatureBitmap(final Bitmap signature) { // View was laid out... if (ViewCompat.isLaidOut(this)) {