Created
May 14, 2018 01:50
-
-
Save byeblogs/f831e49d72a41a4381f62636b873aa63 to your computer and use it in GitHub Desktop.
Example Of Swipe Up/Down Like A Facebook Comments..
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// AndroidManifest.xml | |
<activity | |
android:name=".PopupActivity" | |
android:theme="@android:style/Theme.Translucent.NoTitleBar"> | |
</activity> | |
// PopupActivity.java | |
package com.project.walkby; | |
import android.animation.Animator; | |
import android.animation.ObjectAnimator; | |
import android.app.Activity; | |
import android.graphics.Point; | |
import android.os.Bundle; | |
import android.view.Display; | |
import android.view.MotionEvent; | |
import android.view.View; | |
import android.widget.LinearLayout; | |
import android.widget.RelativeLayout; | |
public class PopupActivity extends Activity implements View.OnTouchListener{ | |
private LinearLayout baseLayout; | |
private int previousFingerPosition = 0; | |
private int baseLayoutPosition = 0; | |
private int defaultViewHeight; | |
private boolean isClosing = false; | |
private boolean isScrollingUp = false; | |
private boolean isScrollingDown = false; | |
@Override | |
protected void onCreate(Bundle savedInstanceState){ | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_popup_facebook); | |
baseLayout = (LinearLayout) findViewById(R.id.base_popup_layout); | |
baseLayout.setOnTouchListener(this); | |
} | |
public boolean onTouch(View view, MotionEvent event) { | |
// Get finger position on screen | |
final int Y = (int) event.getRawY(); | |
// Switch on motion event type | |
switch (event.getAction() & MotionEvent.ACTION_MASK) { | |
case MotionEvent.ACTION_DOWN: | |
// save default base layout height | |
defaultViewHeight = baseLayout.getHeight(); | |
// Init finger and view position | |
previousFingerPosition = Y; | |
baseLayoutPosition = (int) baseLayout.getY(); | |
break; | |
case MotionEvent.ACTION_UP: | |
// If user was doing a scroll up | |
if(isScrollingUp){ | |
// Reset baselayout position | |
baseLayout.setY(0); | |
// We are not in scrolling up mode anymore | |
isScrollingUp = false; | |
} | |
// If user was doing a scroll down | |
if(isScrollingDown){ | |
// Reset baselayout position | |
baseLayout.setY(0); | |
// Reset base layout size | |
baseLayout.getLayoutParams().height = defaultViewHeight; | |
baseLayout.requestLayout(); | |
// We are not in scrolling down mode anymore | |
isScrollingDown = false; | |
} | |
break; | |
case MotionEvent.ACTION_MOVE: | |
if(!isClosing){ | |
int currentYPosition = (int) baseLayout.getY(); | |
// If we scroll up | |
if(previousFingerPosition >Y){ | |
// First time android rise an event for "up" move | |
if(!isScrollingUp){ | |
isScrollingUp = true; | |
} | |
// Has user scroll down before -> view is smaller than it's default size -> resize it instead of change it position | |
if(baseLayout.getHeight()<defaultViewHeight){ | |
baseLayout.getLayoutParams().height = baseLayout.getHeight() - (Y - previousFingerPosition); | |
baseLayout.requestLayout(); | |
} | |
else { | |
// Has user scroll enough to "auto close" popup ? | |
if ((baseLayoutPosition - currentYPosition) > defaultViewHeight / 4) { | |
closeUpAndDismissDialog(currentYPosition); | |
return true; | |
} | |
// | |
} | |
baseLayout.setY(baseLayout.getY() + (Y - previousFingerPosition)); | |
} | |
// If we scroll down | |
else{ | |
// First time android rise an event for "down" move | |
if(!isScrollingDown){ | |
isScrollingDown = true; | |
} | |
// Has user scroll enough to "auto close" popup ? | |
if (Math.abs(baseLayoutPosition - currentYPosition) > defaultViewHeight / 2) | |
{ | |
closeDownAndDismissDialog(currentYPosition); | |
return true; | |
} | |
// Change base layout size and position (must change position because view anchor is top left corner) | |
baseLayout.setY(baseLayout.getY() + (Y - previousFingerPosition)); | |
baseLayout.getLayoutParams().height = baseLayout.getHeight() - (Y - previousFingerPosition); | |
baseLayout.requestLayout(); | |
} | |
// Update position | |
previousFingerPosition = Y; | |
} | |
break; | |
} | |
return true; | |
} | |
public void closeUpAndDismissDialog(int currentPosition){ | |
isClosing = true; | |
ObjectAnimator positionAnimator = ObjectAnimator.ofFloat(baseLayout, "y", currentPosition, -baseLayout.getHeight()); | |
positionAnimator.setDuration(500); | |
positionAnimator.addListener(new Animator.AnimatorListener() { | |
@Override | |
public void onAnimationStart(Animator animator) { | |
} | |
@Override | |
public void onAnimationEnd(Animator animator) { | |
finish(); | |
} | |
@Override | |
public void onAnimationCancel(Animator animator) { | |
} | |
@Override | |
public void onAnimationRepeat(Animator animator) { | |
} | |
}); | |
positionAnimator.start(); | |
} | |
public void closeDownAndDismissDialog(int currentPosition){ | |
isClosing = true; | |
Display display = getWindowManager().getDefaultDisplay(); | |
Point size = new Point(); | |
display.getSize(size); | |
int screenHeight = size.y; | |
ObjectAnimator positionAnimator = ObjectAnimator.ofFloat(baseLayout, "y", currentPosition, screenHeight+baseLayout.getHeight()); | |
positionAnimator.setDuration(500); | |
positionAnimator.addListener(new Animator.AnimatorListener() { | |
@Override | |
public void onAnimationStart(Animator animator) { | |
} | |
@Override | |
public void onAnimationEnd(Animator animator) { | |
finish(); | |
} | |
@Override | |
public void onAnimationCancel(Animator animator) { | |
} | |
@Override | |
public void onAnimationRepeat(Animator animator) { | |
} | |
}); | |
positionAnimator.start(); | |
} | |
} | |
//Activicty_popup_facebook.xml | |
<?xml version="1.0" encoding="utf-8"?> | |
<LinearLayout | |
xmlns:android="http://schemas.android.com/apk/res/android" | |
android:id="@+id/base_popup_layout" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
android:padding="5dp" | |
android:background="@drawable/rounded_popup_facebook"> | |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
xmlns:tools="http://schemas.android.com/tools" | |
xmlns:app="http://schemas.android.com/apk/res-auto" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
android:orientation="vertical"> | |
<TextView | |
android:padding="5dp" | |
android:text="25 Message" | |
android:textSize="15dp" | |
android:textStyle="bold" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content"/> | |
<include | |
layout="@layout/message_type" | |
android:layout_width="match_parent" | |
android:layout_weight="1" | |
android:layout_height="wrap_content" | |
android:gravity="bottom" /> | |
</LinearLayout> | |
</LinearLayout> | |
//rounded_popup_facebook.xm | |
<?xml version="1.0" encoding="utf-8"?> | |
<shape xmlns:android="http://schemas.android.com/apk/res/android"> | |
<corners android:radius="5dp" /> | |
<solid android:color="#ffffff" /> | |
</shape> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment