DEV Community

chuross
chuross

Posted on

Twitterのような画像をフリックすると画面を閉じれるライブラリを作った - FlingLayout

今回の成果物

FlingLayout

https://github.com/chuross/flinglayout

31901843-b1bdb554-b85d-11e7-9ae4-cc49b3a161b2.gif

特徴

Twitterの画像とこで使われてるように、上下にフリック操作すると画面を閉じれる挙動をレイアウトに内包するだけで実現できる。

導入

  1. jitpackをrepositoryに追加する
repositories {
    maven { url "https://jitpack.io" }
}
  1. dependenciesにライブラリを追加する
dependencies {
    compile 'com.github.chuross:flinglayout:x.x.x'
}

使い方

サンプルプロジェクトではPhotoViewを使って実現している。

具体的にどう使えばTwitterみたいにできるんじゃみたいなの知りたい場合はここ見てね

https://github.com/chuross/flinglayout/tree/master/app

XMLにレイアウトを記述する

これだけで挙動自体は完成
内包できるViewは1つだけなので注意

<com.github.chuross.flinglayout.FlingLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <!-- something view parent -->

</com.github.chuross.flinglayout.FlingLayout>

ドラッグ操作を制御する

FlingLatoutにドラッグを無効にするフラグを用意しているので適宜セットする

val flingLayout = findViewById<FlingLayout>(R.id.flinglayout)
flingLayout.isDragEnabled = false

サンプルプロジェクトではPhotoViewのスケールを見てフラグを必要に応じてセットしている。(拡大時はFlingLayoutはドラッグ操作を受け付けないようにしている)

Dismissのリスナーを拾って画面を閉じる

いつものDismiss用のリスナーセットできるようにしてあるので、それを使えばおk

val flingLayout = findViewById<FlingLayout>(R.id.flinglayout)
flingLayout.dismissListener = { /** something your code **/ }

XML属性一覧

key type description etc
fl_isDragEnabled boolean ドラッグの有効 / 無効
fl_isDismissEnabled boolean Dismissの有効 / 無効 無効にした場合はスワイプしても元の位置に戻る

ライセンス

Copyright 2017 chuross

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.

あとがき

内部的にはViewDragHelperを使用しているので、実装はいたってシンプルに作れた。

需要はありそうな気がしてたけど、ざっと検索した感じ引っかからなかったり、メンテされてなくてビルドできなかったりしてたので自分で作った。

Top comments (0)