├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── MIGRATION.md
├── README.md
├── app
├── .gitignore
├── build.gradle
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── example
│ │ └── slideup
│ │ ├── SlideDownViewActivity.java
│ │ ├── SlideEndViewActivity.java
│ │ ├── SlideStartViewActivity.java
│ │ └── SlideUpViewActivity.java
│ └── res
│ ├── drawable
│ ├── ic_arrow_drop_down_black_24dp.xml
│ ├── ic_call_black_24dp.xml
│ ├── ic_keyboard_arrow_down_black_24dp.xml
│ ├── ic_keyboard_arrow_left_black_24dp.xml
│ ├── ic_keyboard_arrow_right_black_24dp.xml
│ ├── ic_keyboard_arrow_up_black_24dp.xml
│ ├── mushroom.png
│ ├── rounded_down_corners_bg.xml
│ ├── rounded_end_corners_bg.xml
│ ├── rounded_start_corners_bg.xml
│ └── rounded_up_corners_bg.xml
│ ├── layout
│ ├── activity_slide_down_view.xml
│ ├── activity_slide_end_view.xml
│ ├── activity_slide_start_view.xml
│ ├── activity_slide_up_view.xml
│ ├── content_slide_down_view.xml
│ ├── content_slide_end_view.xml
│ ├── content_slide_start_view.xml
│ └── content_slide_up_view.xml
│ ├── menu
│ ├── menu_slide_down_view.xml
│ ├── menu_slide_end_view.xml
│ ├── menu_slide_start_view.xml
│ └── menu_slide_up_view.xml
│ ├── mipmap-hdpi
│ └── ic_launcher.png
│ ├── mipmap-mdpi
│ └── ic_launcher.png
│ ├── mipmap-xhdpi
│ └── ic_launcher.png
│ ├── mipmap-xxhdpi
│ └── ic_launcher.png
│ ├── mipmap-xxxhdpi
│ └── ic_launcher.png
│ ├── values-v21
│ └── styles.xml
│ ├── values-w820dp
│ └── dimens.xml
│ └── values
│ ├── colors.xml
│ ├── dimens.xml
│ ├── strings.xml
│ └── styles.xml
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── library
├── .gitignore
├── build.gradle
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── mancj
│ │ └── slideup
│ │ ├── AnimationProcessor.java
│ │ ├── HorizontalTouchConsumer.java
│ │ ├── Internal.java
│ │ ├── LoggerNotifier.java
│ │ ├── OnGlobalLayoutSingleListener.java
│ │ ├── SlideUp.java
│ │ ├── SlideUpBuilder.java
│ │ ├── TouchConsumer.java
│ │ └── VerticalTouchConsumer.java
│ └── res
│ ├── values-ldrtl
│ └── params.xml
│ ├── values-ru
│ └── strings.xml
│ └── values
│ ├── params.xml
│ └── strings.xml
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle/
2 | *build/
3 | captures/
4 | local.properties
5 | .idea/
6 | */*.iml
7 | /SlideUp-Android.iml
8 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ## v2.2.8 (03.01.2018)
2 | - Add capability to trigger SlideUp (up/down/start/end) from another View **thanks [@toteto](https://github.com/toteto)**
3 | - Dropped support Android < 14 api level
4 |
5 | ## v2.2.7.1 (25.07.2017)
6 | - Fixed wrong identifiers for [AboutLibraries](https://github.com/mikepenz/AboutLibraries) (© MikePenz)
7 |
8 | ## v2.2.7 (13.07.2017)
9 | - Added definition info for [AboutLibraries](https://github.com/mikepenz/AboutLibraries) (© MikePenz)
10 |
11 | ## v2.2.6 (13.07.2017)
12 | - Fixed problems with clicks onto `view` with `SlideUp`-effect
13 | - `SlideUp.Builder` was moved into separated class and renamed to `SlideUpBuilder`
14 | #### SlideUp
15 | - Method `setTouchebleArea(float touchableArea)` was split to two methods:
16 | - `setTouchebleAreaDp(float touchableArea)`
17 | - `setTouchebleAreaPx(float touchableArea)`
18 | - Method `getTouchebleArea()` was split to two methods:
19 | - `getTouchebleAreaDp()`
20 | - `getTouchebleAreaPx()`
21 | #### SlideUpBuilder
22 | - Method `withTouchebleArea(float touchableArea)` was split to two methods:
23 | - `withTouchebleAreaDp(float touchableArea)`
24 | - `withTouchebleAreaPx(float touchableArea)`
25 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Mansur
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/MIGRATION.md:
--------------------------------------------------------------------------------
1 | # v2.2.6 → ...
2 | - `SlideUp.Builder` was moved into separated class and renamed to `SlideUpBuilder`
3 | #### SlideUp
4 | - method `void : setTouchebleArea(float touchableArea)` was split to two methods:
5 | - `void : setTouchebleAreaDp(float touchableArea)`
6 | - `void : setTouchebleAreaPx(float touchableArea)`
7 | - method `float : getTouchebleArea()` was split to two methods:
8 | - `float : getTouchebleAreaDp()`
9 | - `float : getTouchebleAreaPx()`
10 | #### SlideUpBuilder
11 | - method `SlideUpBuilder : withTouchebleArea(float touchableArea)` was split to two methods:
12 | - `SlideUpBuilder : withTouchebleAreaDp(float touchableArea)`
13 | - `SlideUpBuilder : withTouchebleAreaPx(float touchableArea)`
14 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # NOT MAINTAINED ANYMORE
2 |
3 | # SlideUp-Android
4 | SlideUp is a small library that allows you to add sweet slide effect to any view. Slide your views up, down, left or right with SlideUp!
5 |
6 | [](https://jitpack.io/#mancj/SlideUp-Android)
7 | ---
8 |
9 | [Example gif 1](https://i.imgur.com/7S5qqSy.gifv)
10 |
11 | [Example gif 2](https://i.imgur.com/hKWqyl1.gif)
12 |
13 | -----
14 | # Usage
15 | **Get SlideUp library**
16 |
17 | Add the JitPack repository to your build file.
18 | Add it in your root build.gradle at the end of repositories:
19 | ```groovy
20 | allprojects {
21 | repositories {
22 | ...
23 | maven { url 'https://jitpack.io' }
24 | }
25 | }
26 | ```
27 | Add the dependency
28 | ```groovy
29 | dependencies {
30 | compile "com.github.mancj:SlideUp-Android:$current_version"
31 | compile 'ru.ztrap:RxSlideUp2:2.x.x' //optional, for reactive listeners based on RxJava-2
32 | compile 'ru.ztrap:RxSlideUp:1.x.x' //optional, for reactive listeners based on RxJava
33 | }
34 | ```
35 |
36 | **To add the SlideUp into your project, follow these three simple steps:**
37 |
38 | ### Step 1:
39 | create any type of layout
40 |
41 | ```xml
42 |
46 | ```
47 |
48 | ### Step 2:
49 | Find that view in your activity/fragment
50 | ```java
51 | View slideView = findViewById(R.id.slideView);
52 | ```
53 |
54 | ### Step 3:
55 | Create a SlideUp object and pass in your view
56 | ```java
57 | slideUp = new SlideUpBuilder(slideView)
58 | .withStartState(SlideUp.State.HIDDEN)
59 | .withStartGravity(Gravity.BOTTOM)
60 |
61 | //.withSlideFromOtherView(anotherView)
62 | //.withGesturesEnabled()
63 | //.withHideSoftInputWhenDisplayed()
64 | //.withInterpolator()
65 | //.withAutoSlideDuration()
66 | //.withLoggingEnabled()
67 | //.withTouchableAreaPx()
68 | //.withTouchableAreaDp()
69 | //.withListeners()
70 | //.withSavedState()
71 | .build();
72 | ```
73 | ### Enjoy!
74 |
75 | # Reactive extensions
76 |
77 | - [RxSlideUp](https://github.com/zTrap/RxSlideUp) - Listening events in reactive style
78 |
79 | # Advanced example
80 | [SlideUpViewActivity.java](https://github.com/mancj/SlideUp-Android/blob/master/app/src/main/java/com/example/slideup/SlideUpViewActivity.java)
81 | ```java
82 | rootView = findViewById(R.id.rootView);
83 | slideView = findViewById(R.id.slideView);
84 | dim = findViewById(R.id.dim);
85 | fab = (FloatingActionButton) findViewById(R.id.fab);
86 |
87 |
88 | slideUp = new SlideUpBuilder(slideView)
89 | .withListeners(new SlideUp.Listener.Events() {
90 | @Override
91 | public void onSlide(float percent) {
92 | dim.setAlpha(1 - (percent / 100));
93 | if (percent < 100 && fab.isShown()) {
94 | // slideUp started showing
95 | fab.hide();
96 | }
97 | }
98 |
99 | @Override
100 | public void onVisibilityChanged(int visibility) {
101 | if (visibility == View.GONE){
102 | fab.show();
103 | }
104 | }
105 | })
106 | .withStartGravity(Gravity.TOP)
107 | .withLoggingEnabled(true)
108 | .withStartState(SlideUp.State.HIDDEN)
109 | .withSlideFromOtherView(rootView)
110 | .build();
111 |
112 | fab.setOnClickListener(new View.OnClickListener() {
113 | @Override
114 | public void onClick(View view) {
115 | slideUp.show();
116 | }
117 | });
118 | ```
119 | The player is designed by [Jauzee](https://github.com/Jauzee)
120 |
121 | # Migration
122 |
123 | - See [MIGRATION.md](https://github.com/mancj/SlideUp-Android/blob/master/MIGRATION.md)
124 |
125 | # Documentation
126 |
127 | - See [javadocs](https://jitpack.io/com/github/mancj/SlideUp-Android/2.2.7.1/javadoc/)
128 |
129 | # Changelog
130 |
131 | - See [CHANGELOG.md](https://github.com/mancj/SlideUp-Android/blob/master/CHANGELOG.md)
132 |
133 | # Contract
134 |
135 | Please let us know, if you use the library in your applications.
136 | We want to collect and publish this list.
137 |
138 | # License
139 |
140 | MIT License
141 |
142 | Copyright (c) 2018 Mansur
143 |
144 | Permission is hereby granted, free of charge, to any person obtaining a copy
145 | of this software and associated documentation files (the "Software"), to deal
146 | in the Software without restriction, including without limitation the rights
147 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
148 | copies of the Software, and to permit persons to whom the Software is
149 | furnished to do so, subject to the following conditions:
150 |
151 | The above copyright notice and this permission notice shall be included in all
152 | copies or substantial portions of the Software.
153 |
154 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
155 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
156 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
157 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
158 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
159 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
160 | SOFTWARE.
161 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 27
5 | buildToolsVersion '27.0.2'
6 | defaultConfig {
7 | applicationId "com.example.slideup"
8 | minSdkVersion 14
9 | targetSdkVersion 27
10 | versionCode 1
11 | versionName "1.0"
12 |
13 | vectorDrawables.useSupportLibrary = true
14 | }
15 | buildTypes {
16 | release {
17 | minifyEnabled false
18 | }
19 | }
20 |
21 | lintOptions {
22 | abortOnError false
23 | }
24 | }
25 |
26 | dependencies {
27 | implementation "com.android.support:appcompat-v7:${versions.support}"
28 | implementation "com.android.support:design:${versions.support}"
29 | implementation project(path: ':library')
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
11 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
25 |
26 |
30 |
31 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/slideup/SlideDownViewActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.slideup;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.design.widget.FloatingActionButton;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.support.v7.widget.Toolbar;
8 | import android.view.Gravity;
9 | import android.view.Menu;
10 | import android.view.MenuItem;
11 | import android.view.View;
12 | import android.widget.Toast;
13 |
14 | import com.mancj.slideup.SlideUp;
15 | import com.mancj.slideup.SlideUpBuilder;
16 |
17 | public class SlideDownViewActivity extends AppCompatActivity {
18 | private SlideUp slideUp;
19 | private View dim;
20 | private View sliderView;
21 | private FloatingActionButton fab;
22 | Toast toast;
23 |
24 | @Override
25 | protected void onCreate(Bundle savedInstanceState) {
26 | super.onCreate(savedInstanceState);
27 | setContentView(R.layout.activity_slide_down_view);
28 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
29 | setSupportActionBar(toolbar);
30 |
31 | sliderView = findViewById(R.id.slideView);
32 | sliderView.setOnClickListener(new View.OnClickListener() {
33 | @Override
34 | public void onClick(View v) {
35 | if (toast != null){
36 | toast.cancel();
37 | }
38 | toast = Toast.makeText(SlideDownViewActivity.this, "click", Toast.LENGTH_SHORT);
39 | toast.show();
40 | }
41 | });
42 | dim = findViewById(R.id.dim);
43 | fab = (FloatingActionButton) findViewById(R.id.fab);
44 |
45 | slideUp = new SlideUpBuilder(sliderView)
46 | .withListeners(new SlideUp.Listener.Events() {
47 | @Override
48 | public void onSlide(float percent) {
49 | dim.setAlpha(1 - (percent / 100));
50 | }
51 |
52 | @Override
53 | public void onVisibilityChanged(int visibility) {
54 | if (visibility == View.GONE){
55 | fab.show();
56 | }
57 | }
58 | })
59 | .withStartGravity(Gravity.TOP)
60 | .withLoggingEnabled(true)
61 | .withStartState(SlideUp.State.HIDDEN)
62 | .build();
63 |
64 | fab.setOnClickListener(new View.OnClickListener() {
65 | @Override
66 | public void onClick(View view) {
67 | slideUp.show();
68 | fab.hide();
69 | }
70 | });
71 |
72 | }
73 |
74 | @Override
75 | public boolean onCreateOptionsMenu(Menu menu) {
76 | getMenuInflater().inflate(R.menu.menu_slide_down_view, menu);
77 | return true;
78 | }
79 |
80 | @Override
81 | public boolean onOptionsItemSelected(MenuItem item) {
82 | switch (item.getItemId()){
83 | case R.id.action_slide_up:
84 | startActivity(new Intent(this, SlideUpViewActivity.class));
85 | break;
86 | case R.id.action_slide_start:
87 | startActivity(new Intent(this, SlideStartViewActivity.class));
88 | break;
89 | case R.id.action_slide_end:
90 | startActivity(new Intent(this, SlideEndViewActivity.class));
91 | break;
92 | }
93 | return super.onOptionsItemSelected(item);
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/slideup/SlideEndViewActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.slideup;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.design.widget.FloatingActionButton;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.support.v7.widget.Toolbar;
8 | import android.view.Gravity;
9 | import android.view.Menu;
10 | import android.view.MenuItem;
11 | import android.view.View;
12 | import android.widget.Toast;
13 |
14 | import com.mancj.slideup.SlideUp;
15 | import com.mancj.slideup.SlideUpBuilder;
16 |
17 | public class SlideEndViewActivity extends AppCompatActivity {
18 | private SlideUp slideUp;
19 | private View dim;
20 | private View sliderView;
21 | private FloatingActionButton fab;
22 | Toast toast;
23 |
24 | @Override
25 | protected void onCreate(Bundle savedInstanceState) {
26 | super.onCreate(savedInstanceState);
27 | setContentView(R.layout.activity_slide_end_view);
28 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
29 | setSupportActionBar(toolbar);
30 |
31 | sliderView = findViewById(R.id.slideView);
32 | sliderView.setOnClickListener(new View.OnClickListener() {
33 | @Override
34 | public void onClick(View v) {
35 | if (toast != null){
36 | toast.cancel();
37 | }
38 | toast = Toast.makeText(SlideEndViewActivity.this, "click", Toast.LENGTH_SHORT);
39 | toast.show();
40 | }
41 | });
42 | dim = findViewById(R.id.dim);
43 | fab = (FloatingActionButton) findViewById(R.id.fab);
44 |
45 | slideUp = new SlideUpBuilder(sliderView)
46 | .withListeners(new SlideUp.Listener.Events() {
47 | @Override
48 | public void onSlide(float percent) {
49 | dim.setAlpha(1 - (percent / 100));
50 | }
51 |
52 | @Override
53 | public void onVisibilityChanged(int visibility) {
54 | if (visibility == View.GONE){
55 | fab.show();
56 | }
57 | }
58 | })
59 | .withStartGravity(Gravity.END)
60 | .withLoggingEnabled(true)
61 | .withStartState(SlideUp.State.HIDDEN)
62 | .withSlideFromOtherView(findViewById(R.id.rootView))
63 | .build();
64 |
65 | fab.setOnClickListener(new View.OnClickListener() {
66 | @Override
67 | public void onClick(View view) {
68 | slideUp.show();
69 | fab.hide();
70 | }
71 | });
72 |
73 | }
74 |
75 | @Override
76 | public boolean onCreateOptionsMenu(Menu menu) {
77 | getMenuInflater().inflate(R.menu.menu_slide_end_view, menu);
78 | return true;
79 | }
80 |
81 | @Override
82 | public boolean onOptionsItemSelected(MenuItem item) {
83 | switch (item.getItemId()){
84 | case R.id.action_slide_up:
85 | startActivity(new Intent(this, SlideUpViewActivity.class));
86 | break;
87 | case R.id.action_slide_start:
88 | startActivity(new Intent(this, SlideStartViewActivity.class));
89 | break;
90 | case R.id.action_slide_down:
91 | startActivity(new Intent(this, SlideDownViewActivity.class));
92 | break;
93 | }
94 | return super.onOptionsItemSelected(item);
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/slideup/SlideStartViewActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.slideup;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.design.widget.FloatingActionButton;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.support.v7.widget.Toolbar;
8 | import android.view.Gravity;
9 | import android.view.Menu;
10 | import android.view.MenuItem;
11 | import android.view.View;
12 | import android.widget.Toast;
13 |
14 | import com.mancj.slideup.SlideUp;
15 | import com.mancj.slideup.SlideUpBuilder;
16 |
17 | public class SlideStartViewActivity extends AppCompatActivity {
18 | private SlideUp slideUp;
19 | private View dim;
20 | private View sliderView;
21 | private FloatingActionButton fab;
22 | Toast toast;
23 |
24 | @Override
25 | protected void onCreate(Bundle savedInstanceState) {
26 | super.onCreate(savedInstanceState);
27 | setContentView(R.layout.activity_slide_start_view);
28 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
29 | setSupportActionBar(toolbar);
30 |
31 | sliderView = findViewById(R.id.slideView);
32 | sliderView.setOnClickListener(new View.OnClickListener() {
33 | @Override
34 | public void onClick(View v) {
35 | if (toast != null){
36 | toast.cancel();
37 | }
38 | toast = Toast.makeText(SlideStartViewActivity.this, "click", Toast.LENGTH_SHORT);
39 | toast.show();
40 | }
41 | });
42 | dim = findViewById(R.id.dim);
43 | fab = (FloatingActionButton) findViewById(R.id.fab);
44 |
45 | slideUp = new SlideUpBuilder(sliderView)
46 | .withListeners(new SlideUp.Listener.Events() {
47 | @Override
48 | public void onSlide(float percent) {
49 | dim.setAlpha(1 - (percent / 100));
50 | }
51 |
52 | @Override
53 | public void onVisibilityChanged(int visibility) {
54 | if (visibility == View.GONE){
55 | fab.show();
56 | }
57 | }
58 | })
59 | .withStartGravity(Gravity.START)
60 | .withLoggingEnabled(true)
61 | .withStartState(SlideUp.State.HIDDEN)
62 | .build();
63 |
64 | fab.setOnClickListener(new View.OnClickListener() {
65 | @Override
66 | public void onClick(View view) {
67 | slideUp.show();
68 | fab.hide();
69 | }
70 | });
71 |
72 | }
73 |
74 | @Override
75 | public boolean onCreateOptionsMenu(Menu menu) {
76 | getMenuInflater().inflate(R.menu.menu_slide_start_view, menu);
77 | return true;
78 | }
79 |
80 | @Override
81 | public boolean onOptionsItemSelected(MenuItem item) {
82 | switch (item.getItemId()){
83 | case R.id.action_slide_up:
84 | startActivity(new Intent(this, SlideUpViewActivity.class));
85 | break;
86 | case R.id.action_slide_end:
87 | startActivity(new Intent(this, SlideEndViewActivity.class));
88 | break;
89 | case R.id.action_slide_down:
90 | startActivity(new Intent(this, SlideDownViewActivity.class));
91 | break;
92 | }
93 | return super.onOptionsItemSelected(item);
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/slideup/SlideUpViewActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.slideup;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.design.widget.FloatingActionButton;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.support.v7.widget.Toolbar;
8 | import android.view.Gravity;
9 | import android.view.Menu;
10 | import android.view.MenuItem;
11 | import android.view.View;
12 | import android.widget.Toast;
13 |
14 | import com.mancj.slideup.SlideUp;
15 | import com.mancj.slideup.SlideUpBuilder;
16 |
17 | public class SlideUpViewActivity extends AppCompatActivity {
18 | private SlideUp slideUp;
19 | private View dim;
20 | private View sliderView;
21 | private FloatingActionButton fab;
22 | Toast toast;
23 |
24 | @Override
25 | protected void onCreate(Bundle savedInstanceState) {
26 | super.onCreate(savedInstanceState);
27 | setContentView(R.layout.activity_slide_up_view);
28 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
29 | setSupportActionBar(toolbar);
30 |
31 | sliderView = findViewById(R.id.slideView);
32 | sliderView.setOnClickListener(new View.OnClickListener() {
33 | @Override
34 | public void onClick(View v) {
35 | if (toast != null){
36 | toast.cancel();
37 | }
38 | toast = Toast.makeText(SlideUpViewActivity.this, "click", Toast.LENGTH_SHORT);
39 | toast.show();
40 | }
41 | });
42 | dim = findViewById(R.id.dim);
43 | fab = (FloatingActionButton) findViewById(R.id.fab);
44 |
45 | slideUp = new SlideUpBuilder(sliderView)
46 | .withListeners(new SlideUp.Listener.Events() {
47 | @Override
48 | public void onSlide(float percent) {
49 | dim.setAlpha(1 - (percent / 100));
50 | if (fab.isShown() && percent < 100) {
51 | fab.hide();
52 | }
53 | }
54 |
55 | @Override
56 | public void onVisibilityChanged(int visibility) {
57 | if (visibility == View.GONE){
58 | fab.show();
59 | }
60 | }
61 | })
62 | .withStartGravity(Gravity.BOTTOM)
63 | .withLoggingEnabled(true)
64 | .withGesturesEnabled(true)
65 | .withStartState(SlideUp.State.HIDDEN)
66 | .withSlideFromOtherView(findViewById(R.id.rootView))
67 | .build();
68 |
69 | fab.setOnClickListener(new View.OnClickListener() {
70 | @Override
71 | public void onClick(View view) {
72 | slideUp.show();
73 | }
74 | });
75 |
76 | }
77 |
78 | @Override
79 | public boolean onCreateOptionsMenu(Menu menu) {
80 | getMenuInflater().inflate(R.menu.menu_slide_up_view, menu);
81 | return true;
82 | }
83 |
84 |
85 | @Override
86 | public boolean onOptionsItemSelected(MenuItem item) {
87 | switch (item.getItemId()){
88 | case R.id.action_slide_start:
89 | startActivity(new Intent(this, SlideStartViewActivity.class));
90 | break;
91 | case R.id.action_slide_end:
92 | startActivity(new Intent(this, SlideEndViewActivity.class));
93 | break;
94 | case R.id.action_slide_down:
95 | startActivity(new Intent(this, SlideDownViewActivity.class));
96 | break;
97 | }
98 | return super.onOptionsItemSelected(item);
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_arrow_drop_down_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_call_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_keyboard_arrow_down_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_keyboard_arrow_left_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_keyboard_arrow_up_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/mushroom.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mancj/SlideUp-Android/6af7fb8b8225adcb898d10e61adebaee65261bf0/app/src/main/res/drawable/mushroom.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/rounded_down_corners_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/rounded_end_corners_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/rounded_start_corners_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/rounded_up_corners_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_slide_down_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
18 |
19 |
23 |
24 |
31 |
32 |
38 |
39 |
40 |
41 |
42 |
43 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_slide_end_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
18 |
19 |
24 |
25 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_slide_start_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
18 |
19 |
23 |
24 |
31 |
32 |
38 |
39 |
40 |
41 |
42 |
43 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_slide_up_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
18 |
19 |
24 |
25 |
31 |
32 |
38 |
39 |
40 |
41 |
43 |
44 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_slide_down_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
21 |
22 |
28 |
29 |
36 |
37 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_slide_end_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
21 |
22 |
28 |
29 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_slide_start_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
21 |
22 |
28 |
29 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_slide_up_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
21 |
22 |
28 |
29 |
36 |
37 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_slide_down_view.xml:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_slide_end_view.xml:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_slide_start_view.xml:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_slide_up_view.xml:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mancj/SlideUp-Android/6af7fb8b8225adcb898d10e61adebaee65261bf0/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mancj/SlideUp-Android/6af7fb8b8225adcb898d10e61adebaee65261bf0/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mancj/SlideUp-Android/6af7fb8b8225adcb898d10e61adebaee65261bf0/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mancj/SlideUp-Android/6af7fb8b8225adcb898d10e61adebaee65261bf0/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mancj/SlideUp-Android/6af7fb8b8225adcb898d10e61adebaee65261bf0/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values-v21/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 | #cecece
7 | #bf000000
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 | 16dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | SlideUp
3 | SlideUp
4 | SlideDown
5 | SlideStart
6 | SlideEnd
7 | SlideUp sample
8 | SlideDown sample
9 | SlideStart sample
10 | SlideEnd sample
11 | Settings
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext {
3 | versions = [
4 | support: '27.0.2'
5 | ]
6 | }
7 | repositories {
8 | google()
9 | mavenCentral()
10 | jcenter()
11 | }
12 | dependencies {
13 | classpath 'com.android.tools.build:gradle:3.0.1'
14 | }
15 | }
16 |
17 | allprojects {
18 | repositories {
19 | jcenter()
20 | google()
21 | }
22 | }
23 |
24 | task clean(type: Delete) {
25 | delete rootProject.buildDir
26 | }
27 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 |
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
18 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mancj/SlideUp-Android/6af7fb8b8225adcb898d10e61adebaee65261bf0/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Thu Oct 05 10:36:33 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/library/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/library/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion 27
5 | buildToolsVersion '27.0.2'
6 |
7 | defaultConfig {
8 | minSdkVersion 14
9 | targetSdkVersion 27
10 | versionCode 9
11 | versionName "2.2.8"
12 | }
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | }
17 | }
18 |
19 | lintOptions {
20 | abortOnError false
21 | }
22 |
23 | tasks.withType(Javadoc) {
24 | options.addStringOption('Xdoclint:none', '-quiet')
25 | options.addStringOption('encoding', 'UTF-8')
26 | }
27 | }
28 |
29 | dependencies {
30 | implementation "com.android.support:support-annotations:${versions.support}"
31 | }
32 |
33 | task androidJavadocs(type: Javadoc) {
34 | source = android.sourceSets.main.java.srcDirs
35 | classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
36 | classpath += configurations.compile
37 | }
38 |
39 | task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
40 | classifier = 'javadoc'
41 | from androidJavadocs.destinationDir
42 | }
43 |
44 | task androidSourcesJar(type: Jar) {
45 | classifier = 'sources'
46 | from android.sourceSets.main.java.sourceFiles
47 | }
48 |
49 | artifacts {
50 | archives androidSourcesJar
51 | archives androidJavadocsJar
52 | }
53 |
--------------------------------------------------------------------------------
/library/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/library/src/main/java/com/mancj/slideup/AnimationProcessor.java:
--------------------------------------------------------------------------------
1 | package com.mancj.slideup;
2 |
3 | import android.animation.Animator;
4 | import android.animation.ValueAnimator;
5 |
6 | /**
7 | * @author pa.gulko zTrap (12.07.2017)
8 | */
9 | class AnimationProcessor {
10 | private SlideUpBuilder mBuilder;
11 | private ValueAnimator mValueAnimator;
12 | private float mSlideAnimationTo;
13 |
14 | AnimationProcessor(SlideUpBuilder builder, ValueAnimator.AnimatorUpdateListener updateListener, Animator.AnimatorListener listener){
15 | mBuilder = builder;
16 | createAnimation(updateListener, listener);
17 | }
18 |
19 | void endAnimation() {
20 | if (mValueAnimator != null && mValueAnimator.getValues() != null && mValueAnimator.isRunning()) {
21 | mValueAnimator.end();
22 | }
23 | }
24 |
25 | void paramsChanged(){
26 | mValueAnimator.setDuration(mBuilder.mAutoSlideDuration);
27 | mValueAnimator.setInterpolator(mBuilder.mInterpolator);
28 | }
29 |
30 | float getSlideAnimationTo() {
31 | return mSlideAnimationTo;
32 | }
33 |
34 | boolean isAnimationRunning(){
35 | return mValueAnimator != null && mValueAnimator.isRunning();
36 | }
37 |
38 | void setValuesAndStart(float from, float to){
39 | mSlideAnimationTo = to;
40 | mValueAnimator.setFloatValues(from, to);
41 | mValueAnimator.start();
42 | }
43 |
44 | private void createAnimation(ValueAnimator.AnimatorUpdateListener updateListener, Animator.AnimatorListener listener){
45 | mValueAnimator = ValueAnimator.ofFloat();
46 | mValueAnimator.setDuration(mBuilder.mAutoSlideDuration);
47 | mValueAnimator.setInterpolator(mBuilder.mInterpolator);
48 | mValueAnimator.addUpdateListener(updateListener);
49 | mValueAnimator.addListener(listener);
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/library/src/main/java/com/mancj/slideup/HorizontalTouchConsumer.java:
--------------------------------------------------------------------------------
1 | package com.mancj.slideup;
2 |
3 | import android.view.MotionEvent;
4 | import android.view.View;
5 |
6 | /**
7 | * @author pa.gulko zTrap (12.07.2017)
8 | */
9 | class HorizontalTouchConsumer extends TouchConsumer {
10 | private boolean mGoingToStart = false;
11 | private boolean mGoingToEnd = false;
12 |
13 | HorizontalTouchConsumer(SlideUpBuilder builder, LoggerNotifier notifier, AnimationProcessor animationProcessor) {
14 | super(builder, notifier, animationProcessor);
15 | }
16 |
17 | boolean consumeEndToStart(View touchedView, MotionEvent event){
18 | float touchedArea = event.getX();
19 | switch (event.getActionMasked()){
20 | case MotionEvent.ACTION_DOWN:
21 | mViewWidth = mBuilder.mSliderView.getWidth();
22 | mStartPositionX = event.getRawX();
23 | mViewStartPositionX = mBuilder.mSliderView.getTranslationX();
24 | mCanSlide = touchFromAlsoSlide(touchedView, event);
25 | mCanSlide |= getStart() + mBuilder.mTouchableArea >= touchedArea;
26 | break;
27 | case MotionEvent.ACTION_MOVE:
28 | float difference = event.getRawX() - mStartPositionX;
29 | float moveTo = mViewStartPositionX + difference;
30 | float percents = moveTo * 100 / mBuilder.mSliderView.getWidth();
31 | calculateDirection(event);
32 |
33 | if (moveTo > 0 && mCanSlide){
34 | mNotifier.notifyPercentChanged(percents);
35 | mBuilder.mSliderView.setTranslationX(moveTo);
36 | }
37 | break;
38 | case MotionEvent.ACTION_UP:
39 | float slideAnimationFrom = mBuilder.mSliderView.getTranslationX();
40 | if (slideAnimationFrom == mViewStartPositionX){
41 | return !Internal.isUpEventInView(mBuilder.mSliderView, event);
42 | }
43 | boolean scrollableAreaConsumed = mBuilder.mSliderView.getTranslationX() > mBuilder.mSliderView.getWidth() / 5;
44 |
45 | if (scrollableAreaConsumed && mGoingToEnd){
46 | mAnimationProcessor.setValuesAndStart(slideAnimationFrom, mBuilder.mSliderView.getWidth());
47 | }else {
48 | mAnimationProcessor.setValuesAndStart(slideAnimationFrom, 0);
49 | }
50 | mCanSlide = true;
51 | break;
52 | }
53 | mPrevPositionY = event.getRawY();
54 | mPrevPositionX = event.getRawX();
55 | return true;
56 | }
57 |
58 | boolean consumeStartToEnd(View touchedView, MotionEvent event){
59 | float touchedArea = event.getX();
60 | switch (event.getActionMasked()){
61 | case MotionEvent.ACTION_DOWN:
62 | mViewWidth = mBuilder.mSliderView.getWidth();
63 | mStartPositionX = event.getRawX();
64 | mViewStartPositionX = mBuilder.mSliderView.getTranslationX();
65 | mCanSlide = touchFromAlsoSlide(touchedView, event);
66 | mCanSlide |= getEnd() - mBuilder.mTouchableArea >= touchedArea;
67 | break;
68 | case MotionEvent.ACTION_MOVE:
69 | float difference = event.getRawX() - mStartPositionX;
70 | float moveTo = mViewStartPositionX + difference;
71 | float percents = moveTo * 100 / -mBuilder.mSliderView.getWidth();
72 | calculateDirection(event);
73 |
74 | if (moveTo < 0 && mCanSlide){
75 | mNotifier.notifyPercentChanged(percents);
76 | mBuilder.mSliderView.setTranslationX(moveTo);
77 | }
78 | break;
79 | case MotionEvent.ACTION_UP:
80 | float slideAnimationFrom = -mBuilder.mSliderView.getTranslationX();
81 | if (slideAnimationFrom == mViewStartPositionX){
82 | return !Internal.isUpEventInView(mBuilder.mSliderView, event);
83 | }
84 | boolean scrollableAreaConsumed = mBuilder.mSliderView.getTranslationX() < -mBuilder.mSliderView.getHeight() / 5;
85 |
86 | if (scrollableAreaConsumed && mGoingToStart){
87 | mAnimationProcessor.setValuesAndStart(slideAnimationFrom, mBuilder.mSliderView.getWidth());
88 | }else {
89 | mAnimationProcessor.setValuesAndStart(slideAnimationFrom, 0);
90 | }
91 | mCanSlide = true;
92 | break;
93 | }
94 | mPrevPositionY = event.getRawY();
95 | mPrevPositionX = event.getRawX();
96 | return true;
97 | }
98 |
99 | private void calculateDirection(MotionEvent event) {
100 | mGoingToStart = mPrevPositionX - event.getRawX() > 0;
101 | mGoingToEnd = mPrevPositionX - event.getRawX() < 0;
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/library/src/main/java/com/mancj/slideup/Internal.java:
--------------------------------------------------------------------------------
1 | package com.mancj.slideup;
2 |
3 | import android.graphics.Rect;
4 | import android.view.MotionEvent;
5 | import android.view.View;
6 |
7 | /**
8 | * @author pa.gulko zTrap (12.07.2017)
9 | */
10 | class Internal {
11 | private static Rect sRect = new Rect();
12 |
13 | static void checkNonNull(Object obj, String message) {
14 | if (obj == null) {
15 | throw new NullPointerException(message);
16 | }
17 | }
18 |
19 | static boolean isUpEventInView(View view, MotionEvent event){
20 | view.getHitRect(sRect);
21 | return sRect.contains((int) event.getRawX(), (int) event.getRawY());
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/library/src/main/java/com/mancj/slideup/LoggerNotifier.java:
--------------------------------------------------------------------------------
1 | package com.mancj.slideup;
2 |
3 | /**
4 | * @author pa.gulko zTrap (05.07.2017)
5 | */
6 | interface LoggerNotifier {
7 |
8 | void notifyPercentChanged(float percent);
9 |
10 | void notifyVisibilityChanged(int visibility);
11 | }
12 |
--------------------------------------------------------------------------------
/library/src/main/java/com/mancj/slideup/OnGlobalLayoutSingleListener.java:
--------------------------------------------------------------------------------
1 | package com.mancj.slideup;
2 |
3 | import android.os.Build;
4 | import android.view.View;
5 | import android.view.ViewTreeObserver;
6 |
7 | /**
8 | * @author pa.gulko zTrap (12.07.2017)
9 | */
10 | public class OnGlobalLayoutSingleListener implements ViewTreeObserver.OnGlobalLayoutListener {
11 | private final View mView;
12 | private final Runnable mRunnable;
13 |
14 | OnGlobalLayoutSingleListener(View view, Runnable runnable) {
15 | mView = view;
16 | mRunnable = runnable;
17 | }
18 |
19 | @Override
20 | public final void onGlobalLayout() {
21 | ViewTreeObserver observer = mView.getViewTreeObserver();
22 | if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) {
23 | observer.removeGlobalOnLayoutListener(this);
24 | } else {
25 | observer.removeOnGlobalLayoutListener(this);
26 | }
27 | mRunnable.run();
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/library/src/main/java/com/mancj/slideup/SlideUp.java:
--------------------------------------------------------------------------------
1 | package com.mancj.slideup;
2 |
3 | import android.animation.Animator;
4 | import android.animation.TimeInterpolator;
5 | import android.animation.ValueAnimator;
6 | import android.content.Context;
7 | import android.os.Bundle;
8 | import android.os.IBinder;
9 | import android.support.annotation.IntDef;
10 | import android.support.annotation.NonNull;
11 | import android.util.Log;
12 | import android.view.MotionEvent;
13 | import android.view.View;
14 | import android.view.inputmethod.InputMethodManager;
15 |
16 | import java.lang.annotation.Retention;
17 | import java.lang.annotation.RetentionPolicy;
18 |
19 | import static android.view.Gravity.BOTTOM;
20 | import static android.view.Gravity.END;
21 | import static android.view.Gravity.START;
22 | import static android.view.Gravity.TOP;
23 | import static android.view.View.GONE;
24 | import static android.view.View.VISIBLE;
25 | import static com.mancj.slideup.SlideUp.State.HIDDEN;
26 | import static com.mancj.slideup.SlideUp.State.SHOWED;
27 |
28 | public class SlideUp implements View.OnTouchListener, ValueAnimator.AnimatorUpdateListener, Animator.AnimatorListener, LoggerNotifier {
29 | private final static String TAG = SlideUp.class.getSimpleName();
30 |
31 | final static String KEY_START_GRAVITY = TAG + "_start_gravity";
32 | final static String KEY_DEBUG = TAG + "_debug";
33 | final static String KEY_TOUCHABLE_AREA = TAG + "_touchable_area";
34 | final static String KEY_STATE = TAG + "_state";
35 | final static String KEY_AUTO_SLIDE_DURATION = TAG + "_auto_slide_duration";
36 | final static String KEY_HIDE_SOFT_INPUT = TAG + "_hide_soft_input";
37 | final static String KEY_STATE_SAVED = TAG + "_state_saved";
38 |
39 | /**
40 | * Available start states
41 | */
42 | public enum State {
43 |
44 | /**
45 | * State hidden is equal {@link View#GONE}
46 | */
47 | HIDDEN,
48 |
49 | /**
50 | * State showed is equal {@link View#VISIBLE}
51 | */
52 | SHOWED
53 | }
54 |
55 | @IntDef(value = {START, END, TOP, BOTTOM})
56 | @Retention(RetentionPolicy.SOURCE)
57 | @interface StartVector {
58 | }
59 |
60 | private State mCurrentState;
61 |
62 | private float mViewHeight;
63 | private float mViewWidth;
64 |
65 | private SlideUpBuilder mBuilder;
66 |
67 | private VerticalTouchConsumer mVerticalTouchConsumer;
68 | private HorizontalTouchConsumer mHorizontalTouchConsumer;
69 |
70 | private AnimationProcessor mAnimationProcessor;
71 |
72 | /**
73 | * Interface to listen to all handled events taking place in the slider
74 | */
75 | public interface Listener {
76 |
77 | interface Slide extends Listener {
78 |
79 | /**
80 | * @param percent percents of complete slide (100 = HIDDEN, 0 = SHOWED)
81 | */
82 | void onSlide(float percent);
83 | }
84 |
85 | interface Visibility extends Listener {
86 |
87 | /**
88 | * @param visibility (GONE or VISIBLE)
89 | */
90 | void onVisibilityChanged(int visibility);
91 | }
92 |
93 | interface Events extends Visibility, Slide {
94 | }
95 | }
96 |
97 | SlideUp(SlideUpBuilder builder) {
98 | mBuilder = builder;
99 | init();
100 | }
101 |
102 | private void init() {
103 | mBuilder.mSliderView.setOnTouchListener(this);
104 | if(mBuilder.mAlsoScrollView != null) {
105 | mBuilder.mAlsoScrollView.setOnTouchListener(this);
106 | }
107 | createAnimation();
108 | mBuilder.mSliderView.getViewTreeObserver().addOnGlobalLayoutListener(
109 | new OnGlobalLayoutSingleListener(mBuilder.mSliderView, new Runnable() {
110 | @Override
111 | public void run() {
112 |
113 | mViewHeight = mBuilder.mSliderView.getHeight();
114 | mViewWidth = mBuilder.mSliderView.getWidth();
115 | switch (mBuilder.mStartGravity) {
116 | case TOP:
117 | mBuilder.mSliderView.setPivotY(mViewHeight);
118 | setTouchableAreaVertical();
119 | break;
120 | case BOTTOM:
121 | mBuilder.mSliderView.setPivotY(0);
122 | setTouchableAreaVertical();
123 | break;
124 | case START:
125 | mBuilder.mSliderView.setPivotX(0);
126 | setTouchableAreaHorizontal();
127 | break;
128 | case END:
129 | mBuilder.mSliderView.setPivotX(mViewWidth);
130 | setTouchableAreaHorizontal();
131 | break;
132 | }
133 | createConsumers();
134 | updateToCurrentState();
135 | }
136 | }));
137 | updateToCurrentState();
138 | }
139 |
140 | private void setTouchableAreaHorizontal(){
141 | if (mBuilder.mTouchableArea == 0) {
142 | mBuilder.mTouchableArea = (float) Math.ceil(mViewWidth / 10);
143 | }
144 | }
145 |
146 | private void setTouchableAreaVertical(){
147 | if (mBuilder.mTouchableArea == 0) {
148 | mBuilder.mTouchableArea = (float) Math.ceil(mViewHeight / 10);
149 | }
150 | }
151 |
152 | private void createAnimation() {
153 | mAnimationProcessor = new AnimationProcessor(mBuilder, this, this);
154 | }
155 |
156 | private void createConsumers() {
157 | createAnimation();
158 | mVerticalTouchConsumer = new VerticalTouchConsumer(mBuilder, this, mAnimationProcessor);
159 | mHorizontalTouchConsumer = new HorizontalTouchConsumer(mBuilder, this, mAnimationProcessor);
160 | }
161 |
162 | private void updateToCurrentState() {
163 | switch (mBuilder.mStartState) {
164 | case HIDDEN:
165 | hideImmediately();
166 | break;
167 | case SHOWED:
168 | showImmediately();
169 | break;
170 | }
171 | }
172 |
173 | //region public interface
174 | /**
175 | * Trying hide soft input from window
176 | *
177 | * @see InputMethodManager#hideSoftInputFromWindow(IBinder, int)
178 | */
179 | public void hideSoftInput() {
180 | ((InputMethodManager) mBuilder.mSliderView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE))
181 | .hideSoftInputFromWindow(mBuilder.mSliderView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
182 | }
183 |
184 | /**
185 | * Trying show soft input to window
186 | *
187 | * @see InputMethodManager#showSoftInput(View, int)
188 | */
189 | public void showSoftInput() {
190 | ((InputMethodManager) mBuilder.mSliderView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE))
191 | .showSoftInput(mBuilder.mSliderView, 0);
192 | }
193 |
194 | /**
195 | * Returns the visibility status for this view.
196 | *
197 | * @return true if view have status {@link View#VISIBLE}
198 | */
199 | public boolean isVisible() {
200 | return mBuilder.mSliderView.getVisibility() == VISIBLE;
201 | }
202 |
203 | /**
204 | * Add Listener which will be used in combination with this SlideUp
205 | */
206 | public void addSlideListener(@NonNull Listener listener) {
207 | mBuilder.mListeners.add(listener);
208 | }
209 |
210 | /**
211 | * Remove Listener which was used in combination with this SlideUp
212 | */
213 | public void removeSlideListener(@NonNull Listener listener) {
214 | mBuilder.mListeners.remove(listener);
215 | }
216 |
217 | /**
218 | * Returns typed view which was used as slider
219 | */
220 | public T getSliderView() {
221 | return (T) mBuilder.mSliderView;
222 | }
223 |
224 | /**
225 | * Set duration of animation (whenever you use {@link #hide()} or {@link #show()} methods)
226 | *
227 | * @param autoSlideDuration (default - 300)
228 | */
229 | public void setAutoSlideDuration(int autoSlideDuration) {
230 | mBuilder.withAutoSlideDuration(autoSlideDuration);
231 | mAnimationProcessor.paramsChanged();
232 | }
233 |
234 | /**
235 | * Returns duration of animation (whenever you use {@link #hide()} or {@link #show()} methods)
236 | */
237 | public float getAutoSlideDuration() {
238 | return mBuilder.mAutoSlideDuration;
239 | }
240 |
241 | /**
242 | * Set touchable area (in dp) for interaction
243 | *
244 | * @param touchableArea (default - 300dp)
245 | */
246 | public void setTouchableAreaDp(float touchableArea) {
247 | mBuilder.withTouchableAreaDp(touchableArea);
248 | }
249 |
250 | /**
251 | * Set touchable area (in px) for interaction
252 | *
253 | * @param touchableArea (default - 300dp)
254 | */
255 | public void setTouchableAreaPx(float touchableArea) {
256 | mBuilder.withTouchableAreaPx(touchableArea);
257 | }
258 |
259 | /**
260 | * Returns touchable area (in dp) for interaction
261 | */
262 | public float getTouchableAreaDp() {
263 | return mBuilder.mTouchableArea / mBuilder.mDensity;
264 | }
265 |
266 | /**
267 | * Returns touchable area (in px) for interaction
268 | */
269 | public float getTouchableAreaPx() {
270 | return mBuilder.mTouchableArea;
271 | }
272 |
273 | /**
274 | * Returns running status of animation
275 | *
276 | * @return true if animation is running
277 | */
278 | public boolean isAnimationRunning() {
279 | return mAnimationProcessor.isAnimationRunning();
280 | }
281 |
282 | /**
283 | * Show view with animation
284 | */
285 | public void show() {
286 | show(false);
287 | }
288 |
289 | /**
290 | * Hide view with animation
291 | */
292 | public void hide() {
293 | hide(false);
294 | }
295 |
296 | /**
297 | * Hide view without animation
298 | */
299 | public void hideImmediately() {
300 | hide(true);
301 | }
302 |
303 | /**
304 | * Show view without animation
305 | */
306 | public void showImmediately() {
307 | show(true);
308 | }
309 |
310 | /**
311 | * Turning on/off debug logging
312 | *
313 | * @param enabled (default - false)
314 | */
315 | public void setLoggingEnabled(boolean enabled) {
316 | mBuilder.withLoggingEnabled(enabled);
317 | }
318 |
319 | /**
320 | * Returns current status of debug logging
321 | */
322 | public boolean isLoggingEnabled() {
323 | return mBuilder.mDebug;
324 | }
325 |
326 | /**
327 | * Turning on/off gestures
328 | *
329 | * @param enabled (default - true)
330 | */
331 | public void setGesturesEnabled(boolean enabled) {
332 | mBuilder.withGesturesEnabled(enabled);
333 | }
334 |
335 | /**
336 | * Returns current status of gestures
337 | */
338 | public boolean isGesturesEnabled() {
339 | return mBuilder.mGesturesEnabled;
340 | }
341 |
342 | /**
343 | * Returns current interpolator
344 | */
345 | public TimeInterpolator getInterpolator() {
346 | return mBuilder.mInterpolator;
347 | }
348 |
349 | /**
350 | * Returns gravity which used in combination with this SlideUp
351 | */
352 | @StartVector
353 | public int getStartGravity() {
354 | return mBuilder.mStartGravity;
355 | }
356 |
357 | /**
358 | * Sets interpolator for animation (whenever you use {@link #hide()} or {@link #show()} methods)
359 | *
360 | * @param interpolator (default - Decelerate interpolator)
361 | */
362 | public void setInterpolator(TimeInterpolator interpolator) {
363 | mBuilder.withInterpolator(interpolator);
364 | mAnimationProcessor.paramsChanged();
365 | }
366 |
367 | /**
368 | * Returns current behavior of soft input
369 | */
370 | public boolean isHideKeyboardWhenDisplayed() {
371 | return mBuilder.mHideKeyboard;
372 | }
373 |
374 | /**
375 | * Sets behavior of soft input
376 | *
377 | * @param hide (default - false)
378 | */
379 | public void setHideKeyboardWhenDisplayed(boolean hide) {
380 | mBuilder.withHideSoftInputWhenDisplayed(hide);
381 | }
382 |
383 | /**
384 | * Toggle current state with animation
385 | */
386 | public void toggle() {
387 | if (isVisible()) {
388 | hide();
389 | } else {
390 | show();
391 | }
392 | }
393 |
394 | /**
395 | * Toggle current state without animation
396 | */
397 | public void toggleImmediately() {
398 | if (isVisible()) {
399 | hideImmediately();
400 | } else {
401 | showImmediately();
402 | }
403 | }
404 |
405 | /**
406 | * Saving current parameters of SlideUp
407 | */
408 | public void onSaveInstanceState(@NonNull Bundle savedState) {
409 | savedState.putBoolean(KEY_STATE_SAVED, true);
410 | savedState.putInt(KEY_START_GRAVITY, mBuilder.mStartGravity);
411 | savedState.putBoolean(KEY_DEBUG, mBuilder.mDebug);
412 | savedState.putFloat(KEY_TOUCHABLE_AREA, mBuilder.mTouchableArea / mBuilder.mDensity);
413 | savedState.putSerializable(KEY_STATE, mCurrentState);
414 | savedState.putInt(KEY_AUTO_SLIDE_DURATION, mBuilder.mAutoSlideDuration);
415 | savedState.putBoolean(KEY_HIDE_SOFT_INPUT, mBuilder.mHideKeyboard);
416 | }
417 | //endregion
418 |
419 | private void hide(boolean immediately) {
420 | mAnimationProcessor.endAnimation();
421 | switch (mBuilder.mStartGravity) {
422 | case TOP:
423 | if (immediately) {
424 | if (mBuilder.mSliderView.getHeight() > 0) {
425 | mBuilder.mSliderView.setTranslationY(-mViewHeight);
426 | notifyPercentChanged(100);
427 | } else {
428 | mBuilder.mStartState = HIDDEN;
429 | }
430 | } else {
431 | mAnimationProcessor.setValuesAndStart(mBuilder.mSliderView.getTranslationY(), mBuilder.mSliderView.getHeight());
432 | }
433 | break;
434 | case BOTTOM:
435 | if (immediately) {
436 | if (mBuilder.mSliderView.getHeight() > 0) {
437 | mBuilder.mSliderView.setTranslationY(mViewHeight);
438 | notifyPercentChanged(100);
439 | } else {
440 | mBuilder.mStartState = HIDDEN;
441 | }
442 | } else {
443 | mAnimationProcessor.setValuesAndStart(mBuilder.mSliderView.getTranslationY(), mBuilder.mSliderView.getHeight());
444 | }
445 | break;
446 | case START:
447 | if (immediately) {
448 | if (mBuilder.mSliderView.getWidth() > 0) {
449 | mBuilder.mSliderView.setTranslationX(-mViewWidth);
450 | notifyPercentChanged(100);
451 | } else {
452 | mBuilder.mStartState = HIDDEN;
453 | }
454 | } else {
455 | mAnimationProcessor.setValuesAndStart(mBuilder.mSliderView.getTranslationX(), mBuilder.mSliderView.getHeight());
456 | }
457 | break;
458 | case END:
459 | if (immediately) {
460 | if (mBuilder.mSliderView.getWidth() > 0) {
461 | mBuilder.mSliderView.setTranslationX(mViewWidth);
462 | notifyPercentChanged(100);
463 | } else {
464 | mBuilder.mStartState = HIDDEN;
465 | }
466 | } else {
467 | mAnimationProcessor.setValuesAndStart(mBuilder.mSliderView.getTranslationX(), mBuilder.mSliderView.getHeight());
468 | }
469 | break;
470 | }
471 | }
472 |
473 | private void show(boolean immediately) {
474 | mAnimationProcessor.endAnimation();
475 | switch (mBuilder.mStartGravity) {
476 | case TOP:
477 | if (immediately) {
478 | if (mBuilder.mSliderView.getHeight() > 0) {
479 | mBuilder.mSliderView.setTranslationY(0);
480 | notifyPercentChanged(0);
481 | } else {
482 | mBuilder.mStartState = SHOWED;
483 | }
484 | } else {
485 | mAnimationProcessor.setValuesAndStart(mBuilder.mSliderView.getTranslationY(), 0);
486 | }
487 | case BOTTOM:
488 | if (immediately) {
489 | if (mBuilder.mSliderView.getHeight() > 0) {
490 | mBuilder.mSliderView.setTranslationY(0);
491 | notifyPercentChanged(0);
492 | } else {
493 | mBuilder.mStartState = SHOWED;
494 | }
495 | } else {
496 | mAnimationProcessor.setValuesAndStart(mBuilder.mSliderView.getTranslationY(), 0);
497 | }
498 | break;
499 | case START:
500 | if (immediately) {
501 | if (mBuilder.mSliderView.getWidth() > 0) {
502 | mBuilder.mSliderView.setTranslationX(0);
503 | notifyPercentChanged(0);
504 | } else {
505 | mBuilder.mStartState = SHOWED;
506 | }
507 | } else {
508 | mAnimationProcessor.setValuesAndStart(mBuilder.mSliderView.getTranslationX(), 0);
509 | }
510 | case END:
511 | if (immediately) {
512 | if (mBuilder.mSliderView.getWidth() > 0) {
513 | mBuilder.mSliderView.setTranslationX(0);
514 | notifyPercentChanged(0);
515 | } else {
516 | mBuilder.mStartState = SHOWED;
517 | }
518 | } else {
519 | mAnimationProcessor.setValuesAndStart(mBuilder.mSliderView.getTranslationX(), 0);
520 | }
521 | break;
522 | }
523 | }
524 |
525 | @Override
526 | public final boolean onTouch(View v, MotionEvent event) {
527 | if (mAnimationProcessor.isAnimationRunning()) return false;
528 | if (!mBuilder.mGesturesEnabled){
529 | mBuilder.mSliderView.performClick();
530 | return true;
531 | }
532 | boolean consumed;
533 | switch (mBuilder.mStartGravity) {
534 | case TOP:
535 | consumed = mVerticalTouchConsumer.consumeTopToBottom(v, event);
536 | break;
537 | case BOTTOM:
538 | consumed = mVerticalTouchConsumer.consumeBottomToTop(v, event);
539 | break;
540 | case START:
541 | consumed = mHorizontalTouchConsumer.consumeStartToEnd(v, event);
542 | break;
543 | case END:
544 | consumed = mHorizontalTouchConsumer.consumeEndToStart(v, event);
545 | break;
546 | default:
547 | throw new IllegalArgumentException("You are using not supported gravity");
548 | }
549 | if (!consumed){
550 | mBuilder.mSliderView.performClick();
551 | }
552 | return true;
553 | }
554 |
555 | @Override
556 | public final void onAnimationUpdate(ValueAnimator animation) {
557 | float value = (float) animation.getAnimatedValue();
558 | switch (mBuilder.mStartGravity) {
559 | case TOP:
560 | onAnimationUpdateTopToBottom(value);
561 | break;
562 | case BOTTOM:
563 | onAnimationUpdateBottomToTop(value);
564 | break;
565 | case START:
566 | onAnimationUpdateStartToEnd(value);
567 | break;
568 | case END:
569 | onAnimationUpdateEndToStart(value);
570 | break;
571 | }
572 | }
573 |
574 | private void onAnimationUpdateTopToBottom(float value) {
575 | mBuilder.mSliderView.setTranslationY(-value);
576 | float visibleDistance = mBuilder.mSliderView.getTop() - mBuilder.mSliderView.getY();
577 | float percents = (visibleDistance) * 100 / mViewHeight;
578 | notifyPercentChanged(percents);
579 | }
580 |
581 | private void onAnimationUpdateBottomToTop(float value) {
582 | mBuilder.mSliderView.setTranslationY(value);
583 | float visibleDistance = mBuilder.mSliderView.getY() - mBuilder.mSliderView.getTop();
584 | float percents = (visibleDistance) * 100 / mViewHeight;
585 | notifyPercentChanged(percents);
586 | }
587 |
588 | private void onAnimationUpdateStartToEnd(float value) {
589 | mBuilder.mSliderView.setTranslationX(-value);
590 | float visibleDistance = mBuilder.mSliderView.getX() - getStart();
591 | float percents = (visibleDistance) * 100 / -mViewWidth;
592 | notifyPercentChanged(percents);
593 | }
594 |
595 | private void onAnimationUpdateEndToStart(float value) {
596 | mBuilder.mSliderView.setTranslationX(value);
597 | float visibleDistance = mBuilder.mSliderView.getX() - getStart();
598 | float percents = (visibleDistance) * 100 / mViewWidth;
599 | notifyPercentChanged(percents);
600 | }
601 |
602 | private int getStart() {
603 | if (mBuilder.mIsRTL) {
604 | return mBuilder.mSliderView.getRight();
605 | } else {
606 | return mBuilder.mSliderView.getLeft();
607 | }
608 | }
609 |
610 | @Override
611 | public void notifyPercentChanged(float percent) {
612 | percent = percent > 100 ? 100 : percent;
613 | percent = percent < 0 ? 0 : percent;
614 | if (percent == 100) {
615 | mBuilder.mSliderView.setVisibility(GONE);
616 | notifyVisibilityChanged(GONE);
617 | } else {
618 | mBuilder.mSliderView.setVisibility(VISIBLE);
619 | if (percent == 0) {
620 | notifyVisibilityChanged(VISIBLE);
621 | }
622 | }
623 | if (mAnimationProcessor.getSlideAnimationTo() == 0 && mBuilder.mHideKeyboard)
624 | hideSoftInput();
625 | if (!mBuilder.mListeners.isEmpty()) {
626 | for (int i = 0; i < mBuilder.mListeners.size(); i++) {
627 | Listener l = mBuilder.mListeners.get(i);
628 | if (l != null) {
629 | if (l instanceof Listener.Slide) {
630 | Listener.Slide slide = (Listener.Slide) l;
631 | slide.onSlide(percent);
632 | logValue(i, "onSlide", percent);
633 | }
634 | } else {
635 | logError(i, "onSlide");
636 | }
637 | }
638 | }
639 | }
640 |
641 | @Override
642 | public void notifyVisibilityChanged(int visibility) {
643 | if (!mBuilder.mListeners.isEmpty()) {
644 | for (int i = 0; i < mBuilder.mListeners.size(); i++) {
645 | Listener l = mBuilder.mListeners.get(i);
646 | if (l != null) {
647 | if (l instanceof Listener.Visibility) {
648 | Listener.Visibility vis = (Listener.Visibility) l;
649 | vis.onVisibilityChanged(visibility);
650 | logValue(i, "onVisibilityChanged", visibility == VISIBLE ? "VISIBLE" : visibility == GONE ? "GONE" : visibility);
651 | }
652 | } else {
653 | logError(i, "onVisibilityChanged");
654 | }
655 | }
656 | }
657 | switch (visibility) {
658 | case VISIBLE:
659 | mCurrentState = SHOWED;
660 | break;
661 | case GONE:
662 | mCurrentState = HIDDEN;
663 | break;
664 | }
665 | }
666 |
667 | @Override
668 | public final void onAnimationStart(Animator animator) {
669 | }
670 |
671 | @Override
672 | public final void onAnimationEnd(Animator animator) {
673 | }
674 |
675 | @Override
676 | public final void onAnimationCancel(Animator animator) {
677 | }
678 |
679 | @Override
680 | public final void onAnimationRepeat(Animator animator) {
681 | }
682 |
683 | private void logValue(int listener, String method, Object message) {
684 | if (mBuilder.mDebug) {
685 | Log.e(TAG, String.format("Listener(%1s) (%2$-23s) value = %3$s", listener, method, message));
686 | }
687 | }
688 |
689 | private void logError(int listener, String method) {
690 | if (mBuilder.mDebug) {
691 | Log.d(TAG, String.format("Listener(%1s) (%2$-23s) Listener is null, skip notification...", listener, method));
692 | }
693 | }
694 | }
695 |
--------------------------------------------------------------------------------
/library/src/main/java/com/mancj/slideup/SlideUpBuilder.java:
--------------------------------------------------------------------------------
1 | package com.mancj.slideup;
2 |
3 | import android.animation.TimeInterpolator;
4 | import android.os.Bundle;
5 | import android.support.annotation.NonNull;
6 | import android.support.annotation.Nullable;
7 | import android.view.Gravity;
8 | import android.view.View;
9 | import android.view.animation.DecelerateInterpolator;
10 |
11 | import java.util.ArrayList;
12 | import java.util.Collections;
13 | import java.util.List;
14 |
15 | /**
16 | * Default constructor for {@link SlideUp}
17 | */
18 | public final class SlideUpBuilder {
19 | private boolean mStateRestored = false;
20 |
21 | View mSliderView;
22 | float mDensity;
23 | float mTouchableArea;
24 | boolean mIsRTL;
25 | SlideUp.State mStartState = SlideUp.State.HIDDEN;
26 | List mListeners = new ArrayList<>();
27 | boolean mDebug = false;
28 | int mAutoSlideDuration = 300;
29 | int mStartGravity = Gravity.BOTTOM;
30 | boolean mGesturesEnabled = true;
31 | boolean mHideKeyboard = false;
32 | TimeInterpolator mInterpolator = new DecelerateInterpolator();
33 | View mAlsoScrollView;
34 |
35 | /**
36 | * Construct a SlideUp by passing the view or his child to use for the generation
37 | */
38 | public SlideUpBuilder(View sliderView) {
39 | Internal.checkNonNull(sliderView, "View can't be null");
40 | mSliderView = sliderView;
41 | mDensity = sliderView.getResources().getDisplayMetrics().density;
42 | mIsRTL = sliderView.getResources().getBoolean(R.bool.is_right_to_left);
43 | }
44 |
45 | /**
46 | * Define a start state on screen
47 | *
48 | * @param startState (default - {@link SlideUp.State#HIDDEN})
49 | */
50 | public SlideUpBuilder withStartState(@NonNull SlideUp.State startState) {
51 | if (!mStateRestored) {
52 | mStartState = startState;
53 | }
54 | return this;
55 | }
56 |
57 | /**
58 | * Define a start gravity, this parameter affects the motion vector slider
59 | *
60 | * @param gravity (default - {@link android.view.Gravity#BOTTOM})
61 | */
62 | public SlideUpBuilder withStartGravity(@SlideUp.StartVector int gravity) {
63 | if (!mStateRestored) {
64 | mStartGravity = gravity;
65 | }
66 | return this;
67 | }
68 |
69 | /**
70 | * Define a {@link SlideUp.Listener} for this SlideUp
71 | *
72 | * @param listeners {@link List} of listeners
73 | */
74 | public SlideUpBuilder withListeners(@NonNull List listeners) {
75 | if (listeners != null) {
76 | mListeners.addAll(listeners);
77 | }
78 | return this;
79 | }
80 |
81 | /**
82 | * Define a {@link SlideUp.Listener} for this SlideUp
83 | *
84 | * @param listeners array of listeners
85 | */
86 | public SlideUpBuilder withListeners(@NonNull SlideUp.Listener... listeners) {
87 | List listeners_list = new ArrayList<>();
88 | Collections.addAll(listeners_list, listeners);
89 | return withListeners(listeners_list);
90 | }
91 |
92 | /**
93 | * Turning on/off debug logging for all handled events
94 | *
95 | * @param enabled (default - false)
96 | */
97 | public SlideUpBuilder withLoggingEnabled(boolean enabled) {
98 | if (!mStateRestored) {
99 | mDebug = enabled;
100 | }
101 | return this;
102 | }
103 |
104 | /**
105 | * Define duration of animation (whenever you use {@link SlideUp#hide()} or {@link SlideUp#show()} methods)
106 | *
107 | * @param duration (default - 300)
108 | */
109 | public SlideUpBuilder withAutoSlideDuration(int duration) {
110 | if (!mStateRestored) {
111 | mAutoSlideDuration = duration;
112 | }
113 | return this;
114 | }
115 |
116 | /**
117 | * Define touchable area (in px) for interaction
118 | *
119 | * @param area (default - 300dp)
120 | */
121 | public SlideUpBuilder withTouchableAreaPx(float area) {
122 | if (!mStateRestored) {
123 | mTouchableArea = area;
124 | }
125 | return this;
126 | }
127 |
128 | /**
129 | * Define touchable area (in dp) for interaction
130 | *
131 | * @param area (default - 300dp)
132 | */
133 | public SlideUpBuilder withTouchableAreaDp(float area) {
134 | if (!mStateRestored) {
135 | mTouchableArea = area * mDensity;
136 | }
137 | return this;
138 | }
139 |
140 | /**
141 | * Turning on/off sliding on touch event
142 | *
143 | * @param enabled (default - true)
144 | */
145 | public SlideUpBuilder withGesturesEnabled(boolean enabled) {
146 | mGesturesEnabled = enabled;
147 | return this;
148 | }
149 |
150 | /**
151 | * Define behavior of soft input
152 | *
153 | * @param hide (default - false)
154 | */
155 | public SlideUpBuilder withHideSoftInputWhenDisplayed(boolean hide) {
156 | if (!mStateRestored) {
157 | mHideKeyboard = hide;
158 | }
159 | return this;
160 | }
161 |
162 | /**
163 | * Define interpolator for animation (whenever you use {@link SlideUp#hide()} or {@link SlideUp#show()} methods)
164 | *
165 | * @param interpolator (default - Decelerate interpolator)
166 | */
167 | public SlideUpBuilder withInterpolator(TimeInterpolator interpolator) {
168 | mInterpolator = interpolator;
169 | return this;
170 | }
171 |
172 | /**
173 | * @param savedState parameters will be restored from this bundle, if it contains them
174 | */
175 | public SlideUpBuilder withSavedState(@Nullable Bundle savedState) {
176 | restoreParams(savedState);
177 | return this;
178 | }
179 |
180 |
181 | /**
182 | * Provide a {@link View} that will also trigger slide events on the {@link SlideUp}.
183 | *
184 | * @param alsoScrollView the other view that will trigger the slide events
185 | */
186 | public SlideUpBuilder withSlideFromOtherView(@Nullable View alsoScrollView) {
187 | mAlsoScrollView = alsoScrollView;
188 | return this;
189 | }
190 |
191 | /**
192 | * Build the SlideUp and add behavior to view
193 | */
194 | public SlideUp build() {
195 | return new SlideUp(this);
196 | }
197 |
198 | /**
199 | * Trying restore saved state
200 | */
201 | private void restoreParams(@Nullable Bundle savedState) {
202 | if (savedState == null) return;
203 | mStateRestored = savedState.getBoolean(SlideUp.KEY_STATE_SAVED, false);
204 | if (savedState.getSerializable(SlideUp.KEY_STATE) != null) {
205 | mStartState = (SlideUp.State) savedState.getSerializable(SlideUp.KEY_STATE);
206 | }
207 | mStartGravity = savedState.getInt(SlideUp.KEY_START_GRAVITY, mStartGravity);
208 | mDebug = savedState.getBoolean(SlideUp.KEY_DEBUG, mDebug);
209 | mTouchableArea = savedState.getFloat(SlideUp.KEY_TOUCHABLE_AREA, mTouchableArea) * mDensity;
210 | mAutoSlideDuration = savedState.getInt(SlideUp.KEY_AUTO_SLIDE_DURATION, mAutoSlideDuration);
211 | mHideKeyboard = savedState.getBoolean(SlideUp.KEY_HIDE_SOFT_INPUT, mHideKeyboard);
212 | }
213 | }
--------------------------------------------------------------------------------
/library/src/main/java/com/mancj/slideup/TouchConsumer.java:
--------------------------------------------------------------------------------
1 | package com.mancj.slideup;
2 |
3 | import android.view.MotionEvent;
4 | import android.view.View;
5 |
6 | /**
7 | * @author pa.gulko zTrap (12.07.2017)
8 | */
9 | class TouchConsumer {
10 | SlideUpBuilder mBuilder;
11 | AnimationProcessor mAnimationProcessor;
12 |
13 | boolean mCanSlide = true;
14 | LoggerNotifier mNotifier;
15 |
16 | float mViewHeight;
17 | float mViewWidth;
18 |
19 | float mStartPositionY;
20 | float mStartPositionX;
21 | volatile float mPrevPositionY;
22 | volatile float mPrevPositionX;
23 | float mViewStartPositionY;
24 | float mViewStartPositionX;
25 |
26 | TouchConsumer(SlideUpBuilder builder, LoggerNotifier notifier,
27 | AnimationProcessor animationProcessor){
28 | mBuilder = builder;
29 | mAnimationProcessor = animationProcessor;
30 | mNotifier = notifier;
31 | }
32 |
33 | int getEnd(){
34 | if (mBuilder.mIsRTL){
35 | return mBuilder.mSliderView.getLeft();
36 | }else {
37 | return mBuilder.mSliderView.getRight();
38 | }
39 | }
40 |
41 | int getStart(){
42 | if (mBuilder.mIsRTL){
43 | return mBuilder.mSliderView.getRight();
44 | }else {
45 | return mBuilder.mSliderView.getLeft();
46 | }
47 | }
48 |
49 | int getTop(){
50 | return mBuilder.mSliderView.getTop();
51 | }
52 |
53 | int getBottom(){
54 | return mBuilder.mSliderView.getBottom();
55 | }
56 |
57 | boolean touchFromAlsoSlide(View touchedView, MotionEvent event) {
58 | return touchedView == mBuilder.mAlsoScrollView;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/library/src/main/java/com/mancj/slideup/VerticalTouchConsumer.java:
--------------------------------------------------------------------------------
1 | package com.mancj.slideup;
2 |
3 | import android.view.MotionEvent;
4 | import android.view.View;
5 |
6 | /**
7 | * @author pa.gulko zTrap (05.07.2017)
8 | */
9 | class VerticalTouchConsumer extends TouchConsumer {
10 | private boolean mGoingUp = false;
11 | private boolean mGoingDown = false;
12 |
13 | VerticalTouchConsumer(SlideUpBuilder builder, LoggerNotifier notifier, AnimationProcessor animationProcessor) {
14 | super(builder, notifier, animationProcessor);
15 | }
16 |
17 | boolean consumeBottomToTop(View touchedView, MotionEvent event){
18 | float touchedArea = event.getY();
19 | switch (event.getActionMasked()){
20 | case MotionEvent.ACTION_DOWN:
21 | mViewHeight = mBuilder.mSliderView.getHeight();
22 | mStartPositionY = event.getRawY();
23 | mViewStartPositionY = mBuilder.mSliderView.getTranslationY();
24 | mCanSlide = touchFromAlsoSlide(touchedView, event);
25 | mCanSlide |= mBuilder.mTouchableArea >= touchedArea;
26 | break;
27 | case MotionEvent.ACTION_MOVE:
28 | float difference = event.getRawY() - mStartPositionY;
29 | float moveTo = mViewStartPositionY + difference;
30 | float percents = moveTo * 100 / mBuilder.mSliderView.getHeight();
31 | calculateDirection(event);
32 |
33 | if (moveTo > 0 && mCanSlide){
34 | mNotifier.notifyPercentChanged(percents);
35 | mBuilder.mSliderView.setTranslationY(moveTo);
36 | }
37 | break;
38 | case MotionEvent.ACTION_UP:
39 | float slideAnimationFrom = mBuilder.mSliderView.getTranslationY();
40 | if (slideAnimationFrom == mViewStartPositionY){
41 | return !Internal.isUpEventInView(mBuilder.mSliderView, event);
42 | }
43 | boolean scrollableAreaConsumed = mBuilder.mSliderView.getTranslationY() > mBuilder.mSliderView.getHeight() / 5;
44 |
45 | if (scrollableAreaConsumed && mGoingDown){
46 | mAnimationProcessor.setValuesAndStart(slideAnimationFrom, mBuilder.mSliderView.getHeight());
47 | } else {
48 | mAnimationProcessor.setValuesAndStart(slideAnimationFrom, 0);
49 | }
50 | mCanSlide = true;
51 | mGoingUp = false;
52 | mGoingDown = false;
53 | break;
54 | }
55 | mPrevPositionY = event.getRawY();
56 | mPrevPositionX = event.getRawX();
57 | return true;
58 | }
59 |
60 | boolean consumeTopToBottom(View touchedView, MotionEvent event){
61 | float touchedArea = event.getY();
62 | switch (event.getActionMasked()){
63 | case MotionEvent.ACTION_DOWN:
64 | mViewHeight = mBuilder.mSliderView.getHeight();
65 | mStartPositionY = event.getRawY();
66 | mViewStartPositionY = mBuilder.mSliderView.getTranslationY();
67 | mCanSlide = touchFromAlsoSlide(touchedView, event);
68 | mCanSlide |= getBottom() - mBuilder.mTouchableArea <= touchedArea;
69 | break;
70 | case MotionEvent.ACTION_MOVE:
71 | float difference = event.getRawY() - mStartPositionY;
72 | float moveTo = mViewStartPositionY + difference;
73 | float percents = moveTo * 100 / -mBuilder.mSliderView.getHeight();
74 | calculateDirection(event);
75 |
76 | if (moveTo < 0 && mCanSlide){
77 | mNotifier.notifyPercentChanged(percents);
78 | mBuilder.mSliderView.setTranslationY(moveTo);
79 | }
80 | break;
81 | case MotionEvent.ACTION_UP:
82 | float slideAnimationFrom = -mBuilder.mSliderView.getTranslationY();
83 | if (slideAnimationFrom == mViewStartPositionY){
84 | return !Internal.isUpEventInView(mBuilder.mSliderView, event);
85 | }
86 | boolean scrollableAreaConsumed = mBuilder.mSliderView.getTranslationY() < -mBuilder.mSliderView.getHeight() / 5;
87 |
88 | if (scrollableAreaConsumed && mGoingUp){
89 | mAnimationProcessor.setValuesAndStart(slideAnimationFrom, mBuilder.mSliderView.getHeight() + mBuilder.mSliderView.getTop());
90 | }else {
91 | mAnimationProcessor.setValuesAndStart(slideAnimationFrom, 0);
92 | }
93 | mCanSlide = true;
94 | break;
95 | }
96 | mPrevPositionY = event.getRawY();
97 | mPrevPositionX = event.getRawX();
98 | return true;
99 | }
100 |
101 | private void calculateDirection(MotionEvent event) {
102 | mGoingUp = mPrevPositionY - event.getRawY() > 0;
103 | mGoingDown = mPrevPositionY - event.getRawY() < 0;
104 | }
105 | }
106 |
--------------------------------------------------------------------------------
/library/src/main/res/values-ldrtl/params.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | true
4 |
--------------------------------------------------------------------------------
/library/src/main/res/values-ru/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | http://mancj.info/
4 |
5 | SlideUp это маленькая библиотека, которая позволяет легко добавить слайд-эффект для любого View-компонента. Слайдите view вверх, вниз, вправо или влево с SlideUp!
7 | ]]>
8 |
9 |
--------------------------------------------------------------------------------
/library/src/main/res/values/params.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | false
4 |
--------------------------------------------------------------------------------
/library/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | owner;year
4 |
5 | Mansur (Mancj)
6 | https://mancj.github.io/
7 |
8 | SlideUp-Android
9 |
10 | SlideUp is a small library that allows you to add sweet slide effect to any view. Slide your views up, down, left or right with SlideUp!
12 | ]]>
13 |
14 | https://github.com/mancj/SlideUp-Android/
15 | 2.2.8
16 |
17 | true
18 | https://github.com/mancj/SlideUp-Android/blob/master/LICENSE
19 |
20 | com.mancj.slideup.SlideUp
21 |
22 | mit
23 |
24 | Mancj
25 | 2018
26 |
27 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':library'
2 |
--------------------------------------------------------------------------------