Coder Social home page Coder Social logo

davidmigloz / drag-to-close Goto Github PK

View Code? Open in Web Editor NEW
70.0 6.0 11.0 6.17 MB

Android library that provides a view group which allows to finish an activity by dragging a view.

License: Apache License 2.0

Kotlin 100.00%
android library viewgroup drag draggable close activity view ui swipe

drag-to-close's Introduction

Drag to close

Android library that provides a view group which allows to finish an activity by dragging a view.

image

Usage

Step 1

Add the JitPack repository to your build.gradle file:

allprojects {
	repositories {
		...
		maven { url "https://jitpack.io" }
	}
}

Step 2

Add the dependency:

dependencies {
	implementation 'com.github.davidmigloz:drag-to-close:1.0.0'
}

CHANGELOG

Step 3

Use DragToClose view group to your layout:

<com.davidmiguel.dragtoclose.DragToClose
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:drag="http://schemas.android.com/apk/res-auto"
    ...
    drag:dragtoclose_draggableContainer="@+id/card"
    drag:dragtoclose_draggableView="@+id/close_arrow"
    drag:dragtoclose_finishActivity="false"
    drag:dragtoclose_closeOnClick="true">

    ...
</com.davidmiguel.dragtoclose.DragToClose>  

Attributes

  • drag:dragtoclose_draggableContainer="[reference]" (required): view that is going to be dragged (in the example, the card).
  • drag:dragtoclose_draggableView="[reference]" (required): view that is going to listen to draggable events (in the example, the arrow).
  • drag:dragtoclose_finishActivity="[true|false]" (default: true): when the draggableContainer is dragged out of the DragToClose view, the activity is finished (activity.finish() is called).
  • drag:dragtoclose_closeOnClick="[true|false]" (default: false): when the draggableView is clicked, draggableContainer is slid down out of the DragToClose view automatically (activity.finish() is called if need be).

Methods

  • getDraggableViewId(): returns the draggable view id.
  • setDraggableViewId(@IdRes int draggableViewId): sets the draggable view id.
  • getDraggableContainerId(): returns the draggable container id.
  • setDraggableContainerId(@IdRes int draggableContainerId): sets the draggable container id.
  • isFinishActivity(): checks whether finish activity is activated or not.
  • setFinishActivity(boolean finishActivity): sets finish activity attribute. If true, the activity is closed when the view is dragged out. Default: true.
  • isCloseOnClick(): checks whether close on click is activated or not.
  • setCloseOnClick(boolean closeOnClick): sets close on click attribute. If true, the draggable container is slid down when the draggable view is clicked. Default: false.
  • setDragListener(DragListener listener): sets drag listener.
  • closeDraggableContainer(): slides down draggable container out of the DragToClose view (activity.finish() is called if need be).
  • openDraggableContainer(): slides up draggable container to its original position.

Callback

If you want to listen to dragging events, you can use DragListener:

  • onStartDraggingView(): invoked when the view has just started to be dragged.
  • onDragging(dragOffset): invoked when the view is being dragged.
  • onViewCosed(): invoked when the view has being dragged out of the screen and just before calling activity.finish() (if need be).
dragToClose.setDragListener(object : DragListener {
    override fun onStartDraggingView() {...}
    override fun onDragging(dragOffset: Float) {...}
    override fun onViewCosed() {...}
})

Take a look at the sample app to see the library working.

Thanks to

  • DragQueen: sample app that shows android's ViewDragHelper usage.
  • DraggablePanel: Android library used to create an awesome Android UI based on a draggable element similar to the last YouTube graphic component.
  • SwipeBack: Android library that can finish a activity by using gesture.

Contributing

If you find any issues or you have any questions, ideas... feel free to open an issue. Pull request are very appreciated.

License

Copyright (c) 2018 David Miguel Lozano

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

drag-to-close's People

Contributors

davidmigloz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

drag-to-close's Issues

onViewCosed() never called if the screen size changes while closing view

If you call closeDraggableContainer() the view slides down and then DragListener.onViewCosed() is called.

However, if the screen size changes during the animation (e.g. the keyboard is open and when the user clicks Done, we close the keyboard and call closeDraggableContainer()), the draggable view gets stuck and DragListener.onViewCosed() is never called:

image

Add container to draggableView

I have added container view to dragtoclose_draggableView it's working drag top to bottom but If my container contain nested scroll view then I scroll to bottom and then try to scroll to the top then scrolling is not working and my view started dragging
Can you please suggest me the solution?

New features

Hey! I like your library and I added some functionality to it:

  • "dragDirection" attr (Up/Down/UpAndDown swipes)
  • "finishFragmentByTag" attr (String)
  • "finishFragmentByContainerId" (reference container layout of fragment)
    and some minor bug fixes. But I've done that in kotlin. If you want I can share a code - I dunno how to do pull requests =\

Close activity on click draggable view

Allow to (optionally) close the activity clicking the draggable view.
So the user can finish the activity in two ways:

  • Dragging down the view.
  • Clicking in draggable view (the arrow in the sample).

Support visual editor

Currently it is not possible to work with the drag to close view group using the visual editor. Not even a preview.

The current version is wrong in the README

hi

i have added

Step 1
Add the JitPack repository to your build.gradle file:

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Step 2
Add the dependency:

dependencies {
implementation 'com.github.davidmigloz:drag-to-close:1.0'
}

but after gradle syncing it shows an error

Failed to resolve: com.github.davidmigloz:drag-to-close:1.0

whats the problem?

Check if draggableContainer or draggableView is null

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: PID: 24380
                  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.getLocationOnScreen(int[])' on a null object reference
                      at com.davidmiguel.dragtoclose.DragToClose.isViewTouched(DragToClose.java:328)
                      at com.davidmiguel.dragtoclose.DragToClose.onTouchEvent(DragToClose.java:121)
                      at android.view.View.dispatchTouchEvent(View.java:10779)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2859)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2535)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2492)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2492)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2492)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2492)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2492)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2492)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2492)
                      at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:582)
                      at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1885)
                      at android.app.Activity.dispatchTouchEvent(Activity.java:3240)
                      at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68)
                      at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:544)
                      at android.view.View.dispatchPointerEvent(View.java:11008)
                      at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5162)
                      at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5014)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4539)
                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4592)
                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4558)
                      at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4691)
                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4566)
                      at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4748)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4539)
                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4592)
                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4558)
                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4566)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4539)
                      at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7099)
                      at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7031)
                      at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6992)
                      at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7209)
                      at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                      at android.os.MessageQueue.nativePollOnce(Native Method)
                      at android.os.MessageQueue.next(MessageQueue.java:323)
                      at android.os.Looper.loop(Looper.java:136)
                      at android.app.ActivityThread.main(ActivityThread.java:6776)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

NullPointerException && InflateException

Caused by: android.view.InflateException: Binary XML file line #0: Attempt to invoke virtual method 'int android.view.View.getTop()' on a null object reference

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getTop()' on a null object reference

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.