Search code examples
androidpainttouch-eventhorizontalscrollview

fingerpaint within a horizontalscrollview


I am combining some pieces of code which I have found on stackoverflow and in the android development kit. I want to put the fingerpaint canvas within a lockable horizontalscrollview. However whenever I atempt to draw in a horizontal direction the scrollview scrolls rather than painting on the canvas. It did not have this problem when I had an imageview in the place of the custom view from fingerpaint. I think that perhaps the overriding of the onTouchEvent in both the custom lockableHorizontalScrollView and the custom drawingView may be at fault. I can provide further details and code if required.

Extracts from:

drawingView.java

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touch_up();
            invalidate();
            break;
    }
    return true;
}

LockableHorizontalScrollView.java

@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // if we can scroll pass the event to the superclass
            if (mScrollable) return super.onTouchEvent(ev);
            // only continue to handle the touch event if scrolling enabled
            return mScrollable; // mScrollable is always false at this point
        default:
            return super.onTouchEvent(ev);
    }
}

Solution

  • This was a arrangement problem with the xml file as well as overriding the wrong method. The button needed to be placed outside of the horizontalScrollView. Instead of the lockableHorizontalScrollView overriding the onTouchEvent method it should have been overriding the onInterceptTouchEvent, the code to which follows;

    public class LockableHorizontalScrollView extends HorizontalScrollView{
    
    public LockableHorizontalScrollView(Context context, AttributeSet attrset) {
        super(context, attrset);
    }
    
    // true if we can scroll (not locked)
    // false if we cannot scroll (locked)
    private boolean mScrollable = true;
    
    public void setIsScrollable(boolean scrollable) {
        mScrollable = scrollable;
    }
    
    public boolean getIsScrollable() {
        return mScrollable;
    }
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (mScrollable) return super.onTouchEvent(ev);
        else return false;
    }