fix some glitches with swiping to sides with Instant media change enabled

This commit is contained in:
tibbi 2018-02-09 16:41:17 +01:00
parent a2b973c233
commit 2a2d37e221
5 changed files with 78 additions and 6 deletions

View file

@ -61,6 +61,10 @@ class PhotoFragment : ViewPagerFragment() {
gif_view.setOnClickListener { photoClicked() } gif_view.setOnClickListener { photoClicked() }
instant_prev_item.setOnClickListener { listener?.goToPrevItem() } instant_prev_item.setOnClickListener { listener?.goToPrevItem() }
instant_next_item.setOnClickListener { listener?.goToNextItem() } instant_next_item.setOnClickListener { listener?.goToNextItem() }
instant_prev_item.parentView = container
instant_next_item.parentView = container
photo_brightness_controller.setOnTouchListener { v, event -> photo_brightness_controller.setOnTouchListener { v, event ->
mediaSideScroll.handleBrightnessTouched(event) mediaSideScroll.handleBrightnessTouched(event)
true true

View file

@ -64,6 +64,8 @@ const val SLIDESHOW_SCROLL_DURATION = 500L
const val NOMEDIA = ".nomedia" const val NOMEDIA = ".nomedia"
const val MAX_COLUMN_COUNT = 20 const val MAX_COLUMN_COUNT = 20
const val SHOW_TEMP_HIDDEN_DURATION = 600000L const val SHOW_TEMP_HIDDEN_DURATION = 600000L
const val CLICK_MAX_DURATION = 150
const val DRAG_THRESHOLD = 10
const val DIRECTORY = "directory" const val DIRECTORY = "directory"
const val MEDIUM = "medium" const val MEDIUM = "medium"

View file

@ -11,7 +11,6 @@ import com.simplemobiletools.gallery.activities.ViewPagerActivity
import com.simplemobiletools.gallery.extensions.audioManager import com.simplemobiletools.gallery.extensions.audioManager
class MediaSideScroll(val activity: Activity, val slideInfoView: TextView, val callback: () -> Unit) { class MediaSideScroll(val activity: Activity, val slideInfoView: TextView, val callback: () -> Unit) {
private val CLICK_MAX_DURATION = 150
private val SLIDE_INFO_FADE_DELAY = 1000L private val SLIDE_INFO_FADE_DELAY = 1000L
private var mTouchDownX = 0f private var mTouchDownX = 0f
private var mTouchDownY = 0f private var mTouchDownY = 0f
@ -38,7 +37,7 @@ class MediaSideScroll(val activity: Activity, val slideInfoView: TextView, val c
val diffX = mTouchDownX - event.x val diffX = mTouchDownX - event.x
val diffY = mTouchDownY - event.y val diffY = mTouchDownY - event.y
if (Math.abs(diffY) > 20 && Math.abs(diffY) > Math.abs(diffX)) { if (Math.abs(diffY) > DRAG_THRESHOLD && Math.abs(diffY) > Math.abs(diffX)) {
var percent = ((diffY / ViewPagerActivity.screenHeight) * 100).toInt() * 3 var percent = ((diffY / ViewPagerActivity.screenHeight) * 100).toInt() * 3
percent = Math.min(100, Math.max(-100, percent)) percent = Math.min(100, Math.max(-100, percent))

View file

@ -0,0 +1,67 @@
package com.simplemobiletools.gallery.views
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.ViewGroup
import android.widget.RelativeLayout
import com.simplemobiletools.gallery.helpers.CLICK_MAX_DURATION
import com.simplemobiletools.gallery.helpers.DRAG_THRESHOLD
// handle only one finger clicks, pass other events to the parent view and ignore it when received again
class InstantItemSwitch(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs) {
private var mTouchDownTime = 0L
private var mTouchDownX = 0f
private var mTouchDownY = 0f
private var passTouches = false
var parentView: ViewGroup? = null
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
if (passTouches) {
if (ev.actionMasked == MotionEvent.ACTION_DOWN) {
passTouches = false
}
return false
}
return super.dispatchTouchEvent(ev)
}
override fun onTouchEvent(event: MotionEvent): Boolean {
if (passTouches) {
return false
}
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
mTouchDownX = event.x
mTouchDownY = event.y
mTouchDownTime = System.currentTimeMillis()
}
MotionEvent.ACTION_UP -> {
if (System.currentTimeMillis() - mTouchDownTime < CLICK_MAX_DURATION) {
performClick()
}
}
MotionEvent.ACTION_MOVE -> {
if (passTouches) {
return false
}
val diffX = mTouchDownX - event.x
val diffY = mTouchDownY - event.y
if (Math.abs(diffX) > DRAG_THRESHOLD || Math.abs(diffY) > DRAG_THRESHOLD) {
if (!passTouches) {
event.action = MotionEvent.ACTION_DOWN
event.setLocation(event.rawX, event.y)
parentView?.dispatchTouchEvent(event)
}
passTouches = true
parentView?.dispatchTouchEvent(event)
return false
}
}
}
return true
}
}

View file

@ -35,8 +35,8 @@
android:id="@+id/photo_brightness_controller" android:id="@+id/photo_brightness_controller"
android:layout_width="@dimen/media_side_slider_width" android:layout_width="@dimen/media_side_slider_width"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_alignParentStart="true" android:layout_alignParentLeft="true"
android:layout_alignParentLeft="true"/> android:layout_alignParentStart="true"/>
<TextView <TextView
android:id="@+id/slide_info" android:id="@+id/slide_info"
@ -55,12 +55,12 @@
android:textColor="@android:color/white" android:textColor="@android:color/white"
android:textSize="@dimen/extra_big_text_size"/> android:textSize="@dimen/extra_big_text_size"/>
<RelativeLayout <com.simplemobiletools.gallery.views.InstantItemSwitch
android:id="@+id/instant_prev_item" android:id="@+id/instant_prev_item"
android:layout_width="@dimen/instant_change_bar_width" android:layout_width="@dimen/instant_change_bar_width"
android:layout_height="match_parent"/> android:layout_height="match_parent"/>
<RelativeLayout <com.simplemobiletools.gallery.views.InstantItemSwitch
android:id="@+id/instant_next_item" android:id="@+id/instant_next_item"
android:layout_width="@dimen/instant_change_bar_width" android:layout_width="@dimen/instant_change_bar_width"
android:layout_height="match_parent" android:layout_height="match_parent"