diff --git a/.gitignore b/.gitignore index 0f6ca2d..8596cd5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,82 @@ -*.iml -.gradle -/local.properties -/.idea/workspace.xml -/.idea/libraries +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Windows thumbnail db +Thumbs.db + +# Windows thumbnail db +Thumbs.db + +# OSX files .DS_Store -/build -/captures + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/ +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/dictionaries +.idea/libraries +.idea/* +*/.idea/* + +# Keystore files +# Uncomment the following line if you do not want to check your keystore files in. +#*.jks + +# External native build folder generated in Android Studio 2.2 and later .externalNativeBuild + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# Android Studio +*.iml .idea +#.idea/workspace.xml - remove # and delete .idea if it better suit your needs. +.gradle +build/ +.navigation +captures/ +output.json + +#NDK +obj/ +.externalNativeBuild \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 6a5feb9..ac4f0cf 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,31 @@ -# ScalingLayout +# ScalingLayout +[![](https://jitpack.io/v/simonebortolin/ScalingLayout.svg)](https://jitpack.io/#simonebortolin/ScalingLayout) + +Android 3rd party library to make implementing a ScalingLayout + Scale your layout on user interaction. [Live Demo](https://www.youtube.com/watch?v=wA41H0UMoHQ) Motivated by layout in [Blinkist](https://play.google.com/store/apps/details?id=com.blinkslabs.blinkist.android) app and search bar in [Spotify](https://play.google.com/store/apps/details?id=com.spotify.music) app. + ## Demo - + ## Fab Demo - + ## Spotify Search Demo - + + +## Landscape Screenshots + + + -## Usage + +## Installation ```xml ``` -## Download -Buy Me a Coffee at ko-fi.com +## Installation +Step1. Add it in your **root** build.gradle at the end of repositories: -```gradle -maven { url 'https://jitpack.io' } -``` + allprojects { + repositories { + ... + maven { url 'https://jitpack.io' } + } + } +Step 2. Add the dependency -```gradle -dependencies { - compile 'com.github.iammert:ScalingLayout:1.2.1' -} -``` -License --------- + + dependencies { + implementation 'com.github.simonebortolin:ScalingLayout:1.3.0' + } +## Credits + + +I thank all the authors of the various commits that I have included in my fork - Copyright 2017 Mert Şimşek. +## License + Copyright (c) 2017 Mert Şimşek. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100644 index f23280a..0000000 --- a/app/.gitignore +++ /dev/null @@ -1,55 +0,0 @@ -# Built application files -*.apk -*.ap_ - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# Intellij -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/dictionaries -.idea/libraries - -# Keystore files -*.jks - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild - -# Google Services (e.g. APIs or Firebase) -google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 2621f81..4261405 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,15 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 26 - buildToolsVersion "26.0.2" + compileSdkVersion androidCompileSdkVersion + buildToolsVersion buildToolsVersion defaultConfig { applicationId "iammert.com.view.scalinglayout" - minSdkVersion 15 - targetSdkVersion 26 - versionCode 1 - versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + minSdkVersion androidMinSdkVersion + targetSdkVersion androidTargetSdkVersion + versionCode versionCode + versionName versionName + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { @@ -20,11 +20,12 @@ android { } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.google.android.material:material:1.1.0' + androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { exclude group: 'com.android.support', module: 'support-annotations' }) - compile 'com.android.support:appcompat-v7:26.1.0' - testCompile 'junit:junit:4.12' - compile project(':scalinglib') + implementation 'androidx.appcompat:appcompat:1.1.0' + testImplementation 'junit:junit:4.12' + implementation project(':scalinglib') } diff --git a/app/src/androidTest/java/iammert/com/view/scalinglayout/ExampleInstrumentedTest.java b/app/src/androidTest/java/iammert/com/view/scalinglayout/ExampleInstrumentedTest.java index fff1f36..95cbbf0 100644 --- a/app/src/androidTest/java/iammert/com/view/scalinglayout/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/iammert/com/view/scalinglayout/ExampleInstrumentedTest.java @@ -1,8 +1,8 @@ package iammert.com.view.scalinglayout; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/app/src/main/java/iammert/com/view/scalinglayout/CollapsingDemoActivity.java b/app/src/main/java/iammert/com/view/scalinglayout/CollapsingDemoActivity.java index 761634f..d8a8c92 100644 --- a/app/src/main/java/iammert/com/view/scalinglayout/CollapsingDemoActivity.java +++ b/app/src/main/java/iammert/com/view/scalinglayout/CollapsingDemoActivity.java @@ -1,9 +1,9 @@ package iammert.com.view.scalinglayout; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; /** * Created by mertsimsek on 01/10/2017. diff --git a/app/src/main/java/iammert/com/view/scalinglayout/FABDemo.java b/app/src/main/java/iammert/com/view/scalinglayout/FABDemo.java index a19d608..f89764d 100644 --- a/app/src/main/java/iammert/com/view/scalinglayout/FABDemo.java +++ b/app/src/main/java/iammert/com/view/scalinglayout/FABDemo.java @@ -1,10 +1,10 @@ package iammert.com.view.scalinglayout; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.view.ViewCompat; -import android.support.v4.view.ViewPropertyAnimatorListener; -import android.support.v7.app.AppCompatActivity; +import androidx.annotation.Nullable; +import androidx.core.view.ViewCompat; +import androidx.core.view.ViewPropertyAnimatorListener; +import androidx.appcompat.app.AppCompatActivity; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; diff --git a/app/src/main/java/iammert/com/view/scalinglayout/MainActivity.java b/app/src/main/java/iammert/com/view/scalinglayout/MainActivity.java index 659923e..f359096 100644 --- a/app/src/main/java/iammert/com/view/scalinglayout/MainActivity.java +++ b/app/src/main/java/iammert/com/view/scalinglayout/MainActivity.java @@ -2,7 +2,7 @@ import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.View; public class MainActivity extends AppCompatActivity { diff --git a/app/src/main/java/iammert/com/view/scalinglayout/SearchBarDemoActivity.java b/app/src/main/java/iammert/com/view/scalinglayout/SearchBarDemoActivity.java index 1367e96..3fc960d 100644 --- a/app/src/main/java/iammert/com/view/scalinglayout/SearchBarDemoActivity.java +++ b/app/src/main/java/iammert/com/view/scalinglayout/SearchBarDemoActivity.java @@ -1,10 +1,10 @@ package iammert.com.view.scalinglayout; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.view.ViewCompat; -import android.support.v4.view.ViewPropertyAnimatorListener; -import android.support.v7.app.AppCompatActivity; +import androidx.annotation.Nullable; +import androidx.core.view.ViewCompat; +import androidx.core.view.ViewPropertyAnimatorListener; +import androidx.appcompat.app.AppCompatActivity; import android.view.View; import android.widget.RelativeLayout; import android.widget.TextView; diff --git a/app/src/main/res/layout/activity_collapsing.xml b/app/src/main/res/layout/activity_collapsing.xml index 5f0c984..f89af49 100644 --- a/app/src/main/res/layout/activity_collapsing.xml +++ b/app/src/main/res/layout/activity_collapsing.xml @@ -1,17 +1,17 @@ - - - - - + - + - - + @@ -152,4 +152,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 89a09cf..59d4020 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,8 +3,6 @@ #071C24 #06151b #00D474 - - #444444 #121212 diff --git a/build.gradle b/build.gradle index 36777fc..bc600d2 100644 --- a/build.gradle +++ b/build.gradle @@ -5,9 +5,10 @@ buildscript { repositories { maven { url 'https://maven.google.com' } jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:4.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -18,9 +19,20 @@ allprojects { repositories { jcenter() maven { url 'https://maven.google.com' } + google() } } +subprojects { + ext.supportLibVersion = '1.0.0' + ext.androidCompileSdkVersion = 29 + ext.androidMinSdkVersion = 21 + ext.androidTargetSdkVersion = 29 + ext.versionName = "1.3.0" + ext.versionCode = 15 + ext.buildToolsVersion = '29.0.3' +} + task clean(type: Delete) { delete rootProject.buildDir } diff --git a/gradle.properties b/gradle.properties index aac7c9b..9e6fce1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,6 +9,8 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. +android.enableJetifier=true +android.useAndroidX=true org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 52e44f3..aa38447 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Sep 30 14:01:47 EEST 2017 +#Sat May 30 17:58:11 CEST 2020 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-6.1.1-all.zip diff --git a/image_1.png b/image_1.png new file mode 100644 index 0000000..c0f3d5f Binary files /dev/null and b/image_1.png differ diff --git a/image_2.png b/image_2.png new file mode 100644 index 0000000..2c7b676 Binary files /dev/null and b/image_2.png differ diff --git a/scalinglib/.gitignore b/scalinglib/.gitignore deleted file mode 100644 index f23280a..0000000 --- a/scalinglib/.gitignore +++ /dev/null @@ -1,55 +0,0 @@ -# Built application files -*.apk -*.ap_ - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# Intellij -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/dictionaries -.idea/libraries - -# Keystore files -*.jks - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild - -# Google Services (e.g. APIs or Firebase) -google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json \ No newline at end of file diff --git a/scalinglib/build.gradle b/scalinglib/build.gradle index 04f1107..2eb9f95 100644 --- a/scalinglib/build.gradle +++ b/scalinglib/build.gradle @@ -2,17 +2,17 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 26 - buildToolsVersion "26.0.2" + compileSdkVersion androidCompileSdkVersion + buildToolsVersion buildToolsVersion defaultConfig { - minSdkVersion 15 - targetSdkVersion 26 - versionCode 1 - versionName "1.0" + minSdkVersion androidMinSdkVersion + targetSdkVersion androidTargetSdkVersion + versionCode versionCode + versionName versionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { @@ -24,6 +24,6 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:design:26.1.0' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.google.android.material:material:1.1.0' } diff --git a/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayout.java b/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayout.java index 4138890..2a9ef0e 100644 --- a/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayout.java +++ b/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayout.java @@ -12,9 +12,9 @@ import android.graphics.PorterDuffXfermode; import android.graphics.RectF; import android.os.Build; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.view.ViewCompat; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.view.ViewCompat; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; @@ -154,14 +154,16 @@ protected void onSizeChanged(int w, int h, int oldw, int oldh) { settings.initialize(w, h); currentWidth = w; currentRadius = settings.getMaxRadius(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { viewOutline = new ScalingLayoutOutlineProvider(w, h, currentRadius); } + } rectF.set(0, 0, w, h); + updateViewOutline(h, currentWidth, currentRadius); - invalidate(); } @Override @@ -220,6 +222,7 @@ public void setProgress(float progress) { if (progress > 1.0f || progress < 0.0f) { return; } + setRadius(settings.getMaxRadius() - settings.getMaxRadius() * progress); } @@ -235,12 +238,14 @@ public void setListener(ScalingLayoutListener scalingLayoutListener) { * @param radius */ private void updateViewOutline(int height, int width, float radius) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && ViewCompat.getElevation(this) > 0f) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { try { + invalidate(); viewOutline.setHeight(height); viewOutline.setWidth(width); viewOutline.setRadius(radius); setOutlineProvider(viewOutline); + setClipToOutline(true); } catch (Exception e) { e.printStackTrace(); } @@ -272,6 +277,8 @@ private void setRadius(float radius) { (int) currentMargins[1], (int) currentMargins[2], (int) currentMargins[3]); + + updateViewOutline(getHeight(), currentWidth, radius); requestLayout(); } @@ -333,7 +340,8 @@ private void updateCurrentElevation() { ViewCompat.setElevation(this, settings.getElevation()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && ViewCompat.getElevation(this) > 0f) { try { - setOutlineProvider(getOutlineProvider()); + setOutlineProvider(viewOutline); + setClipToOutline(true); } catch (Exception e) { e.printStackTrace(); } @@ -355,6 +363,10 @@ private void notifyListener() { } } + public boolean hasToolbar() { + return settings.hasToolbar(); + } + @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public ViewOutlineProvider getOutlineProvider() { diff --git a/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutBehavior.java b/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutBehavior.java index 485cb9a..a948360 100644 --- a/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutBehavior.java +++ b/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutBehavior.java @@ -1,9 +1,13 @@ package iammert.com.view.scalinglib; import android.content.Context; -import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CoordinatorLayout; + +import com.google.android.material.appbar.AppBarLayout; + +import androidx.coordinatorlayout.widget.CoordinatorLayout; + import android.util.AttributeSet; +import android.util.TypedValue; import android.view.View; /** @@ -12,11 +16,16 @@ public class ScalingLayoutBehavior extends CoordinatorLayout.Behavior { - private final float toolbarHeightInPixel; + private float toolbarHeightInPixel; public ScalingLayoutBehavior(Context context, AttributeSet attrs) { super(context, attrs); - toolbarHeightInPixel = context.getResources().getDimensionPixelSize(R.dimen.sl_toolbar_size); + TypedValue tv = new TypedValue(); + if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { + toolbarHeightInPixel = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics()); + } else { + toolbarHeightInPixel = 0f; + } } @Override @@ -27,9 +36,12 @@ public boolean layoutDependsOn(CoordinatorLayout parent, ScalingLayout child, Vi @Override public boolean onDependentViewChanged(CoordinatorLayout parent, ScalingLayout child, View dependency) { int totalScrollRange = ((AppBarLayout) dependency).getTotalScrollRange(); + if (!child.hasToolbar()) toolbarHeightInPixel = 0; + child.setProgress((-dependency.getY()) / totalScrollRange); if (totalScrollRange + dependency.getY() > (float) child.getMeasuredHeight() / 2) { child.setTranslationY(totalScrollRange + dependency.getY() + toolbarHeightInPixel - (float) child.getMeasuredHeight() / 2); + } else { child.setTranslationY(toolbarHeightInPixel); } diff --git a/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutOutlineProvider.java b/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutOutlineProvider.java index bfdca6a..19696aa 100644 --- a/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutOutlineProvider.java +++ b/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutOutlineProvider.java @@ -2,7 +2,7 @@ import android.graphics.Outline; import android.os.Build; -import android.support.annotation.RequiresApi; +import androidx.annotation.RequiresApi; import android.view.View; import android.view.ViewOutlineProvider; @@ -10,7 +10,7 @@ * Created by mertsimsek on 08/01/2018. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class ScalingLayoutOutlineProvider extends ViewOutlineProvider { +public class ScalingLayoutOutlineProvider extends ViewOutlineProvider { private int width; private int height; @@ -27,6 +27,7 @@ public void getOutline(View view, Outline outline) { outline.setRoundRect(0, 0, width, height, radius); } + public int getWidth() { return width; } diff --git a/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutSettings.java b/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutSettings.java index 1864807..65964ef 100644 --- a/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutSettings.java +++ b/scalinglib/src/main/java/iammert/com/view/scalinglib/ScalingLayoutSettings.java @@ -18,10 +18,12 @@ public class ScalingLayoutSettings { private float maxRadius; private float elevation; private boolean isInitialized = false; + private boolean hasToolbar ; public ScalingLayoutSettings(Context context, AttributeSet attributeSet) { TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.ScalingLayout); radiusFactor = typedArray.getFloat(R.styleable.ScalingLayout_radiusFactor, DEFAULT_RADIUS_FACTOR); + hasToolbar = typedArray.getBoolean(R.styleable.ScalingLayout_hasToolbar,true); maxWidth = context.getResources().getDisplayMetrics().widthPixels; typedArray.recycle(); @@ -62,4 +64,8 @@ public void setElevation(float elevation) { public float getElevation() { return elevation; } + + public boolean hasToolbar() { + return hasToolbar; + } } diff --git a/scalinglib/src/main/res/values/attrs.xml b/scalinglib/src/main/res/values/attrs.xml index 8ea1a9d..aeeed69 100644 --- a/scalinglib/src/main/res/values/attrs.xml +++ b/scalinglib/src/main/res/values/attrs.xml @@ -3,6 +3,7 @@ + \ No newline at end of file