目的是实现一个画廊,其适配器返回listViews(换句话说,嵌入在水平滚动图库中的垂直滚动列表视图)。这是在工作后起作用的,但是当试图水平滚动时,ListView看起来非常抖动,就像它的核心是居中一样。我没有在画廊中嵌入任何其他类型的视图观察到这种行为。

这是我尝试的:

最初,我发现ListView挤压了触摸事件,因此画廊上的手势听众从未被解雇。

因此,在活动的onCreate()方法中,我创建了一个fenuretetector:

galleryGestureDetector = new GestureDetector(this, gallery);

然后,在画廊适配器的getView()方法中,在列表视图被夸大和配置后,我有一些类似的代码:

listView.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        galleryGestureDetector.onTouchEvent(event);
        return true;
    }
});

在这种情况下,我什至走到了从OnTouchListener返回真实的极端步骤,以确保从未实际调用ListView的OnTouchEvent()方法。发生相同的抖动行为。结果,我认为我可以排除两种观点之间的OnTouchEvent()实现竞争。

我也尝试通过将画廊的触摸矩形扩展到listView,然后强迫ListView将其委托给它,但也尝试滥用TouchDelegate概念,但这也是徒劳的。

我会举起手,说目前不可能,但是与Droidx一起包装的社交网络应用程序以某种方式完成了!

有帮助吗?

解决方案

问题在于,ListView正在从画廊拦截触摸事件,然后更改视图位置本身。这就是导致在使用小部件时看到的来回抖动效果的原因。我认为这是画廊小部件中的一个错误,但与此同时,它可以通过这样的子分类库来修复:

public class BetterGallery extends Gallery {
private boolean scrollingHorizontally = false;

public BetterGallery(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public BetterGallery(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public BetterGallery(Context context) {
    super(context);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    super.onInterceptTouchEvent(ev);
    return scrollingHorizontally;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    scrollingHorizontally = true;
    return super.onScroll(e1, e2, distanceX, distanceY);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch(event.getAction()) {
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:
        scrollingHorizontally = false;
    }

    return super.onTouchEvent(event);
}

}

如果您使用BetterGallery代替画廊,那么整个过程都可以!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top