android


Let parent View assume MotionEvents if child returns false


I have a application that need event handling on a unusual way.
For my question, let me first explain a simple case that the current event handling system of Android don't fits for me.
Supposing that I have a FrameLayout (that I'll call ViewSwiper since now) that all Views added on it are MATCH_PARENT X MATCH_PARENT (that I'll call PageView), it's handles events by translating the actual View and replace it based on the direction of moving.
This component I already have done and work properly ( Using Animation to swipe views ).
But the problem is on that PageView I add on top of it, in case of ImageViews that return false on it's onTouchEvent, the ViewSwiper will handle the events and let another PageView enter the screen, but if I add a ScrollView on that, all the events will be consumed by the Scroll and the ViewSwiper will not have chance to replace the PageView.
So I figured out that returning false onTouchEvent of the ScrollView the parent can assume it's events, I wrote this sub-class of ScrollView to test it:
public class ScrollViewVertical extends ScrollView {
public ScrollViewVertical(Context context) {
super(context);
setOverScrollMode(OVER_SCROLL_ALWAYS);
setVerticalScrollBarEnabled(false);
}
public boolean onTouchEvent(MotionEvent evt) {
super.onTouchEvent(evt);
return false;
}
}
But returning false make any further events to get dispatched to the parent, but I need these events for VERTICAL scrolling, so I have the idea to return falses only if the user are moving HORIZONTAL, that's what my code looks like:
public class ScrollViewVertical extends ScrollView {
private MovementTracker moveTracker;
public ScrollViewVertical(Context context) {
super(context);
setOverScrollMode(OVER_SCROLL_ALWAYS);
setVerticalScrollBarEnabled(false);
moveTracker = new MovementTracker();
}
public boolean onTouchEvent(MotionEvent evt) {
if (moveTracker.track(evt))
if (moveTracker.getDirection() == Direction.HORIZONTAL)
return false;
return super.onTouchEvent(evt);
}
}
PS: MovementTracker will returns true on track() after some events and tell on which direction the user is moving.
But in that case, the ScrollView keep receiving events since it's returns true on the first events.
Any ideas on how can I handle the events on ViewSwiper when it's child returns false (even if some trues are returned).
PS: I can give more info about this if needed, and accept different solutions also.
Based on answers I tried the following:
#Override
public boolean dispatchTouchEvent(MotionEvent ev) {
onTouchEvent(ev);
return intercept;
}
public boolean onTouchEvent(MotionEvent evt) {
boolean x = super.onTouchEvent(evt);
if (moveTracker.track(evt)) {
intercept = moveTracker.getDirection() != Direction.VERTICAL;
if (!intercept)
getParent().requestDisallowInterceptTouchEvent(false);
}
return x;
}
Still nothing.
try this in onTouchEvent() of the scrollview
//if (evt.getAction() == MotionEvent.ACTION_MOVE) {
if (moveTracker.track(evt)){
if (moveTracker.getDirection() == Direction.VERTICAL){
//Or the direction you want the scrollview keep moving
getParent().requestDisallowInterceptTouchEvent(true);
}
}
return true;
Update
Please try the following to the custom Scrollview
#Override
public boolean dispatchTouchEvent(MotionEvent ev) {
super.dispatchTouchEvent(ev);
return false;
}
And nothing else
This way i assume the MotionEvent will perform on both views. And since they don't conflict (One is vertical the other one is Horizontal) this could work
Based on the answer from weakwire, I came to the following solution:
On ViewSwiper
#Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if(!super.dispatchTouchEvent(ev))
onTouchEvent(ev);
return true;
}
And on ScrollHorizontal I return false on dispatchTouchEvent when I don't need then anymore.

Related Links

Using Texture in ImageView
Unfortunately app has stopped measures
Apply android.graphics.Matrix transformation to an Open GL ES shader
Is there a way to send the calendar appointments from the standard android google calendar to another (android) app?
How to draw on google map when google map fragment is not visible
Keep a view state/aspect after rotation
ListView IndexOutOfBoundsException
How does onLocationChanged works?
Water Image : Chemical Analysis [closed]
Jsoup.connect Throws error
How to add custom header while making a pjsip makecall()?
traversing ListView using another CustomView i.e through up and down button in android
FragmentActivity incompatible with FragmentStatePagerAdapter
Phonegap: Open a URL in default browser
Android app not working in kitkat version but working in lesser versions
How to save the accelerometer data into log files in android?

Categories

HOME
cheerio
angular2-material
themes
battery
sitecore
error-handling
access
pearson-correlation
recordrtc
vimdiff
pega
why3
xcodebuild
endpoint
code-generation
symbol
azure-powershell
glyphicons
vuejs
digital-signature
identity-management
undertow
react-toolbox
exploit
froala
definitelytyped
pylons
jasmine-node
progress-bar
bringtofront
google-earth
ntp
dotspatial
mockjax
angularjs-material
card.io
classcastexception
graphhopper
flatmap
mongoose-schema
odoo-website
levenshtein-distance
glm-math
file-sharing
apache-directory
vaadin-charts
snapchat
opencmis
vaadin-elements
ovf
gitlist
user-defined-fields
context-sensitive-grammar
pdf-conversion
bootstrap-tags-input
branch-prediction
stripe-connect
slackware
myspace
file-uri
hclust
android-dateutils
observablecollection
shopping
gcloud-ruby
redis-cluster
libav
thread-sleep
piracy-prevention
sapscript
ember-cli-rails
sha512
linked-tables
entity-framework-4.3
zend-currency
punycode
ignite-ui
personalization
alternate
renderer
cfcache
git-repo
windows-embedded-standard
scriptaculous
solace-mq
workitem
dolby-audio-api
nokia-s40
listitem
cuda-gdb
inkcanvas
usertype
box2d-iphone
node-redis
timthumb
cuteeditor
tmx
diagrams
metaweblog
cruisecontrol.rb
updatesourcetrigger
silent
silverlight-oob
wordprocessingml
linfu-dynamicproxy
appliance
great-circle

Resources

Encrypt Message