kotlinのScrollViewクラスで、スクロールが止まった時に処理が動くように実装することは可能でしょうか?
公式ドキュメントを調べても使えそうな関数は載っていませんでした。
https://developer.android.com/reference/kotlin/android/widget/ScrollView
やりたいことは、スクロールが止まった時の位置の取得です。
何か良い方法があれば教えていただきたいです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/19 04:51
2019/10/19 14:38
2019/10/21 07:29
回答2件
0
jimbeさんの回答だとOnScrollChangeListenerを使用していてAndroid M(APIレベル23)以降でしか動かないので、それ以前のバージョンでも動作させたい場合は以下のようにScrollViewを拡張したクラスを実装して代わりに利用する方法があります。
kotlin
1class StopAwareScrollView(...) : ScrollView(...) { 2 private var debounceTask: Runnable? = null 3 4 var onStopListener: (Int, Int) -> Unit = { _, _ -> } 5 6 override fun onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int) { 7 super.onScrollChanged(l, t, oldl, oldt) 8 9 removeCallbacks(debounceTask) 10 debounceTask = Runnable { onStopListener(l, t) } 11 postDelayed(debounceTask, 1000L) 12 } 13 14 override fun onDetachedFromWindow() { 15 super.onDetachedFromWindow() 16 removeCallbacks(debounceTask) 17 } 18}
- イベントを受け取る側
kotlin
1scrollView.onStopListener = { x, y -> 2 // do something... 3}
なお、こちらの実装ではThreadではなくHandlerを利用しているので、リスナーはメインスレッド上で呼ばれます。
投稿2019/10/21 23:15
編集2019/10/21 23:16総合スコア3131
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
時間の監視でよろしければ, スクロールしたらリセットするタイマーを作り, そのタイマーが1秒経過したら「停止中」と判断しては如何でしょうか.
kotlin が使えないため java で失礼します.
非常にざっくりです.
activity_main.xml
xml
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context="com.teratail.q218060.MainActivity"> 8 9 <ScrollView 10 android:layout_width="match_parent" 11 android:layout_height="match_parent" 12 android:id="@+id/scrollView"> 13 14 <TextView 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" 17 android:id="@+id/textView"/> 18 </ScrollView> 19</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
java
1package com.teratail.q218060; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.os.Bundle; 6import android.util.Log; 7import android.view.View; 8import android.widget.ScrollView; 9import android.widget.TextView; 10 11public class MainActivity extends AppCompatActivity { 12 private ScrollStopDetector scrollStopDetector; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 TextView textView = findViewById(R.id.textView); 19 for(int i=1; i<=50; i++) textView.append(i+"\n"); 20 21 ScrollView scrollView = findViewById(R.id.scrollView); 22 scrollStopDetector = new ScrollStopDetector(scrollView, 1000, new ScrollStopDetector.Listener() { 23 @Override 24 public void stopped(View v) { 25 Log.d("MainActivity", "Scroll STOP"); 26 } 27 }); 28 scrollView.setOnScrollChangeListener(scrollStopDetector); 29 30 scrollStopDetector.start(); 31 } 32 @Override 33 protected void onDestroy() { 34 super.onDestroy(); 35 scrollStopDetector.finish(); 36 } 37}
ScrollStopDetector.java
java
1package com.teratail.q218060; 2 3import android.view.View; 4import android.widget.ScrollView; 5 6class ScrollStopDetector implements View.OnScrollChangeListener { 7 interface Listener { 8 void stopped(View v); 9 } 10 11 private class Sleeper implements Runnable { 12 @Override 13 public void run() { 14 while(!finish) { 15 try { 16 Thread.sleep(millis); //[ms] 17 listener.stopped(view); 18 } catch(InterruptedException ignore) { 19 } 20 } 21 } 22 } 23 24 private ScrollView view; 25 private long millis; 26 private Listener listener; 27 private Thread thread; 28 private boolean finish; 29 30 ScrollStopDetector(ScrollView view, long millis, Listener listener) { 31 this.view = view; 32 this.millis = millis; 33 this.listener = listener; 34 } 35 void start() { 36 thread = new Thread(new Sleeper()); 37 thread.start(); 38 } 39 void finish() { 40 finish = true; 41 } 42 43 @Override 44 public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 45 if(thread != null) thread.interrupt(); 46 } 47}
投稿2019/10/21 15:35
編集2019/10/22 09:32総合スコア13202
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。