【问题标题】:fingerpaint within a horizontalscrollview水平滚动视图中的手指画
【发布时间】:2011-05-22 19:18:01
【问题描述】:

我正在组合我在 stackoverflow 和 android 开发工具包中找到的一些代码。我想将手指画布放在可锁定的水平滚动视图中。但是,每当我尝试在水平方向上绘制时,滚动视图都会滚动而不是在画布上绘画。当我有一个图像视图代替手指画的自定义视图时,它没有这个问题。我认为可能在自定义 lockableHorizo​​ntalScrollView 和自定义drawingView 中覆盖 onTouchEvent 可能有问题。如果需要,我可以提供更多详细信息和代码。

摘自:

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;
}

LockableHorizo​​ntalScrollView.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);
    }
}

【问题讨论】:

    标签: android paint touch-event horizontalscrollview


    【解决方案1】:

    这是 xml 文件的排列问题以及覆盖错误的方法。该按钮需要放置在水平滚动视图之外。而不是 lockableHorizo​​ntalScrollView 覆盖 onTouchEvent 方法,它应该覆盖 onInterceptTouchEvent,代码如下;

    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;
    }
    

    【讨论】:

      【解决方案2】:

      我不明白您希望滚动行为如何工作:具体来说,系统如何区分滚动手势和绘画手势。

      但是,您可以通过阅读上一个问题了解如何以编程方式启用和禁用滚动:

      Disable ScrollView action

      【讨论】:

      • 您所包含的源似乎确实有部分帮助,但现在绘图组件在放弃之前只会在水平方向上绘制小部分。我想还有其他手势需要考虑。在我绘画时滚动应该被锁定,然后当我点击一个按钮时,滚动行为应该被恢复。
      • 看起来我可能还必须重写 onInterceptTouchEvent。我会尽力解决它。这是我找到的链接; stackoverflow.com/questions/2646028/…
      猜你喜欢
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2015-12-21
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多