Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6855147
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 27, 20262026-05-27T01:43:16+00:00 2026-05-27T01:43:16+00:00

I have a Gallery whose Adapter creates several LinearLayout instances. Those linear layout instances

  • 0

I have a Gallery whose Adapter creates several LinearLayout instances. Those linear layout instances have buttons, however, and when someone clicks the buttons, they can’t drag the gallery.

My idea is having a menu that the user can scroll through. The kind of thing that would normally be done with a ScrollView, but because I want the scrolled view to ‘Snap’ to the current button pages, a Gallery works better.

This question is similar to this one: Android gallery of LinearLayouts

However, while I’ve fixed the ‘buttons appear clicked’ when dragging issue, I can’t seem to make it work like a ScrollView does, by having the buttons work as part of the dragging area.

Any hints?

Not sure if the code is relevant, but here it is.

Layout that contains the gallery:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

        <Gallery
            android:id="@+id/gallery"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" android:fadingEdge="none"
            android:spacing="0dp"/>

</FrameLayout>

The test activity that populates the gallery:

import com.zehfernando.display.widgets.ZGallery;

public class ScrollTestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.scrolltest);

        Gallery gallery = (Gallery) findViewById(R.id.gallery);
        gallery.setAdapter(new LayoutAdapter(this));
    }

    public class LayoutAdapter extends BaseAdapter {
        private Context mContext;

        public LayoutAdapter(Context c) {
            mContext = c;
        }

        public int getCount() {
            return 3;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View v = vi.inflate(R.layout.scrolllayout, null);
            v.setMinimumWidth(getWindowManager().getDefaultDisplay().getWidth());
            return v;
        }
    }
}

The layout for the frames that go inside the gallery:

<?xml version="1.0" encoding="utf-8"?>
<com.zehfernando.display.widgets.ScrollableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/buttonRegister"
        android:layout_width="200dp"
        android:layout_height="72dp"
        android:text="REGISTER"/>

    <Button
        android:id="@+id/buttonUnregister"
        android:layout_width="match_parent"
        android:layout_height="72dp"
        android:text="UNREGISTER" />

</com.zehfernando.display.widgets.ScrollableLinearLayout>

“ScrollableLinearLayout” is just my class that extends LinearLayout to override onPressed.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-27T01:43:17+00:00Added an answer on May 27, 2026 at 1:43 am

    Ok, I think I got it, so here it is in case anyone runs into this in the future.

    I didn’t know very well how touch events propagated down the display list, so this took a lot more trial and error than I’d like to admit, but basically: one can intercept touch events on a parent and not let it propagate to children, basically turning buttons useless (allowing users to click and drag it, sending the events to the parent’s onTouchEvent instead). This is done with the onInterceptTouchEvent method.

    So instead of having a Gallery, I’ve extended it (calling it a ZGallery for now). This is enough to make the contained buttons useless:

    @Override
    public boolean onInterceptTouchEvent(MotionEvent __e) {
        return true;
    }
    

    But of course, I wanted to make sure the buttons worked (that they were clickable), while also allowing drag.

    There’s probably a more clever way to do this, but what I do is intercept the touch event on my new Gallery (like above), but allowing it to go through (returning false) until the user has moved the ‘cursor’ by a given threshold – then I interpret it as a dragging intention, start properly intercepting the touch event. This causes touch events to be sent to my own gallery, working as intended.

    You can modify it to make it work for vertical or horizontal drags only too.

    So anyway, this is a simplified version of a Gallery class that allows dragging on any element inside of it:

    public class ZGallery extends Gallery {
    
        // Constants
        protected static final float DRAG_THRESHOLD = 10; // If dragging for more than this amount of pixels, means it's a scroll
    
        // Properties
        protected boolean isPressed;
        protected float startPressX;
        protected float startPressY;
        protected boolean isDragging;
    
        // ================================================================================================================
        // CONSTRUCTOR ----------------------------------------------------------------------------------------------------
    
        public ZGallery(Context context) {
            this(context, null);
        }
    
        public ZGallery(Context context, AttributeSet attrs) {
            this(context, attrs, R.attr.galleryStyle);
        }
    
        public ZGallery(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        // ================================================================================================================
        // EVENT INTERFACE ------------------------------------------------------------------------------------------------
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent __e) {
            // Intercepts all touch screen motion events.  This allows you to watch events as they are dispatched to your children, and take ownership of the current gesture at any point.
            // Return true to steal motion events from the children and have them dispatched to this ViewGroup through onTouchEvent().
            // The current target will receive an ACTION_CANCEL event, and no further messages will be delivered here.
    
            //return super.onInterceptTouchEvent(__e); // super always returns false
    
            // If this function returns TRUE, NO children get dragging events. This only happens
            // the first interception (mouse down); if true is returned, nothing is intercepted anymore, and
            // events are passed to onTouchEvent directly.
            // If FALSE is returned, this may be called again, but only if there's a children receiving the
            // events instead of this.
            // In sum, once onTouchEvent is called here, onInterceptTouchEvent is not called anymore.
    
            // Interprets drag data
            return evaluateTouchEvent(__e);
    
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent __e) {
            // Interprets drag data
            evaluateTouchEvent(__e);
    
            // Properly lets superclass interpret touch events (for dragging, fling, etc)
            return super.onTouchEvent(__e);
        }
    
        protected boolean evaluateTouchEvent(MotionEvent __e) {
            // Interprets motion to see if the user is dragging the View
            // This will run in parallel with the children events
            float dragDeltaX;
            float dragDeltaY;
    
            switch (__e.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    // Pressing...
                    isPressed = true;
                    startPressX = __e.getX();
                    startPressY = __e.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    // Moving...
                    if (isPressed && !isDragging) {
                        dragDeltaX = __e.getX() - startPressX;
                        dragDeltaY = __e.getY() - startPressY;
    
                        if (Math.abs(dragDeltaX) > DRAG_THRESHOLD || Math.abs(dragDeltaY) > DRAG_THRESHOLD) {
                            // Moved too far, means it's dragging!
    
                            // Inject click from correct position so superclass code knows where to drag from
                            MotionEvent me = MotionEvent.obtain(__e);
                            me.setAction(MotionEvent.ACTION_DOWN);
                            me.setLocation(__e.getX() - dragDeltaX, __e.getY() - dragDeltaY);
                            super.onTouchEvent(me);
    
                            isDragging = true;
                        }
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    // Releasing...
                    if (isPressed) {
                        isPressed = false;
                        // Let go while pressed
                        if (isDragging) {
                            // Was dragging, so just go back
                            isDragging = false;
                        } else {
                            // Was not dragging, this will trigger a click
                        }
                    }
                    break;
            }
    
    
            // If not dragging, event should be passed on
            // If dragging, the event should be intercepted and interpreted by this gallery's onTouchEvent instead
            return isDragging;
        }
    }
    

    It seems to work well. Hopefully it’ll be helpful to someone else!

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

The goal is to implement a Gallery whose adapter returns ListViews (in other words,
I have a gallery which has 7 + linear layouts in each view, and
I have a gallery I quickly coded up for a small site, and under
I have photo gallery code that does image re-sizing and thumbnail creation. I use
I my working on the site that will have image gallery. Designer idea was
Jquery, AJAX and URL changes... I have a gallery, and when the image change
I have a small gallery of thumbnails. When I place my mouse pointer over
I have an image gallery that I created by reading the contents inside a
I have the video gallery in my database, which has over 200 000 videos.
I have a photo gallery web page where a single <img src="XXX" /> element's

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.