【发布时间】:2014-09-26 19:27:02
【问题描述】:
我在 android 市场 (ViewPager) 中有水平滚动页面。
我的问题是我想在其中包含一些图像的水平滚动视图?这可能吗??
现在,我在我的视图中滚动一点,然后整个页面都在滚动。
感谢您的宝贵时间!
【问题讨论】:
-
观看this 回答。但是,您可能需要扩展您的 HorizontalScrollingView,而不是该答案中的自定义 WebView。
标签: android
我在 android 市场 (ViewPager) 中有水平滚动页面。
我的问题是我想在其中包含一些图像的水平滚动视图?这可能吗??
现在,我在我的视图中滚动一点,然后整个页面都在滚动。
感谢您的宝贵时间!
【问题讨论】:
标签: android
您需要扩展HorizontalScrollView 并拦截触摸事件。对我有用的是以下示例:
public class MyScrollView extends HorizontalScrollView {
public MyScrollView(Context p_context, AttributeSet p_attrs)
{
super(p_context, p_attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent p_event)
{
return true;
}
@Override
public boolean onTouchEvent(MotionEvent p_event)
{
if (p_event.getAction() == MotionEvent.ACTION_MOVE && getParent() != null)
{
getParent().requestDisallowInterceptTouchEvent(true);
}
return super.onTouchEvent(p_event);
}
}
然后,您需要使用此自定义视图,而不是在布局 XML 中使用 HorizontalScrollView。
【讨论】:
onClick()的例子吗?
我重新设计了一个解决方案,最后找到了一种非常简单的方法来实现它,就像在 GMail 上所做的那样:HorizontalScrollView 将滚动直到它到达它的一个边缘。然后在下一次滚动时,整个页面都会滚动。
只需覆盖 HorizontalScrollView 以检查滚动方向与边缘,并确保内容可以实际滚动。
@Override
public boolean onTouchEvent(MotionEvent ev)
{
if (no_scrolling)
return false;
// Standard behavior
//
return super.onTouchEvent(ev);
}
boolean no_scrolling = false;
float old_x, old_y;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
int action = ev.getActionMasked();
Log.d(at_data.TAG, "HSV scroll intercept: " + String.format("0x%08x", action));
if (action == MotionEvent.ACTION_DOWN)
{
old_x = ev.getX();
old_y = ev.getY();
no_scrolling = false;
}
else if (action == MotionEvent.ACTION_MOVE)
{
float dx = ev.getX() - old_x;
float dy = ev.getY() - old_y;
if (Math.abs(dx) > Math.abs(dy) && dx != 0)
{
View hsvChild = getChildAt(0);
int childW = hsvChild.getWidth();
int W = getWidth();
Log.d(at_data.TAG, "HSV " + childW + " > " + W + " ? dx = " + dx + " dy = " + dy);
if (childW > W)
{
int scrollx = getScrollX();
if ( (dx < 0 && scrollx + W >= childW) || (dx > 0 && scrollx <= 0))
{
Log.d(at_data.TAG, "HSV Wider: on edge already");
no_scrolling = true;
return false;
}
else
{
Log.d(at_data.TAG, "HSV Wider: can scroll");
no_scrolling = false;
}
}
else
{
Log.d(at_data.TAG, "HSV cannot scroll in desired direction");
no_scrolling = true;
}
}
}
// Standard behavior
//
return super.onInterceptTouchEvent(ev);
}
【讨论】:
<Linearlayout>
<linearlayout>
<scrollView>
<ImageView1></ImageView>
<ImageView2></....>
</scrollView>
</Linearlayout>
<EditText>
</Linearlayout>
在上述情况下,scrollVIew 仅适用于两个图像,不适用于编辑文本。
其他情况:
<Linearlayout>
<linearlayout>
<scrollView>
here listVIew with Images using listView adapter
</scrollView>
</Linearlayout>
<EditText>
</Linearlayout>
这里的scrollView只适用于listView。
【讨论】: