我使用Android兼容包版本4在我的应用程序中显示pdf页面.我使用PagerAdapter和ViewPager来显示水平滚动视图等pdf页面.
现在的问题在于分页相关的东西.我可以通过检测viewpager中的子进程根据这个线程android:ViewPager和HorizontalScrollVIew来停止分页,但是当用户触摸该视图之外时,我该如何才能启用它.我使用了以下CodeViewPager代码.
public class CustomViewPager extends ViewPager {
private boolean enabled;
private int childId;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = true;
}
public void setChildId(int childId) {
this.childId = childId;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
boolean result = false;
View scroll = getChildAt(childId);
if (scroll != null) {
Rect rect = new Rect();
CommonLogic.logMessage("PDF Page Rectangle ", TAG, Log.VERBOSE);
scroll.getHitRect(rect);
if (rect.contains((int) event.getX(), (int) event.getY())) {
setPagingEnabled(false);
result = true;
}
} …Run Code Online (Sandbox Code Playgroud) 有没有办法在滚动ViewPager的项目时锁定ListView的垂直滚动?或者也许更改ViewPager的水平滚动灵敏度?
谢谢.
最后的编辑
这是我更新的解决方案.感谢您回复Masoud Dadashi,您的评论最终让我想出了解决问题的方法.
这是我的自定义ListView类:
public class FolderListView extends ListView {
private float xDistance, yDistance, lastX, lastY;
// If built programmatically
public FolderListView(Context context) {
super(context);
// init();
}
// This example uses this method since being built from XML
public FolderListView(Context context, AttributeSet attrs) {
super(context, attrs);
// init();
}
// Build from XML layout
public FolderListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// init();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) { …Run Code Online (Sandbox Code Playgroud) 我有一个ListView,每个项目都是水平的RecyclerView.我面临的问题是,水平滚动不是很平滑.如果我在一个完全水平的方向上滚动/滑动,那么它工作正常,但如果滚动甚至略微非水平(比如与水平成10度角),它认为上/下滚动而不是左/右,由于父母ListView.我试过这个方法:
recyclerView.setOnTouchListener(new FlingRecyclerView.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
Log.i("Scroll down", "Intercept true");
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_MOVE:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
// Handle HorizontalScrollView touch events.
v.onTouchEvent(event);
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
但它不是很有效.事实上,我没有注意到很多改进.那是因为只有当动作完全水平时才会调用此动作事件 - 这种情况已经正常工作了.然后我尝试这样做:
class MyGestureDetector extends GestureDetector.SimpleOnGestureListener …Run Code Online (Sandbox Code Playgroud) android listview scroll user-experience android-recyclerview
我在ListView的每一行都有一个ViewPager小部件.这提供了类似于架子的UI,因此用户可以在垂直方向上滚动搜索架子,然后在架子的内容中水平滚动.这有效.
但是滚动体验非常糟糕:如果我开始拖动一个架子的ViewPager,水平滚动它,不小心向上/向下拖动一下,然后ListView"陷阱"这个拖动动作,并开始垂直滚动,结束我的水平拖动.在这种状态下,拖动动作不会"返回"到ViewPager,ListView拥有它,就是这样.我必须再次启动另一个拖动操作来影响ViewPager.所以我猜ListView在这些情况下具有优先权.
怎么解决这个问题?我想要完全相反:如果列表行中的ViewPager开始对水平拖动做出反应,那么它应该捕获该动作,并且无论用户如何移动他/她的手指,此拖动都应该停止影响ListView垂直.可以这样做吗?
我必须制作一个用户在屏幕上移动的应用程序,就像我们的android主屏幕一样.
有一个图像列表,我们可以在水平滚动条中滚动图像.
用户无法更改图像的位置,就像在水平屏幕上排列的一些缩略图一样
这就像iPhone应用程序开发中的分页控件.
我试图找到这样做的方法,但我对android很新,我想知道实现上述目标的最佳方法吗?
我听说过画廊控制,但我不确定它是否适合我的目的.
此外,如果你能给出你建议的答案的链接..这将是很好的,好像有一个新的控制器参与,我将能够更好地理解它,因为我仍然是一个更新鲜.先感谢您.
编辑:对于那些不熟悉iPhone分页视图的人,这是一个视频示例.
可能重复:
手势检测和ScrollView问题
编辑:问题与完整的代码在这里问.
我有一个孩子的布局.我设置了一个手势监听器来检测布局上的水平滑动.当布局是LinearLayout时,正确检测到滑动,但是当它是ScrollView时,它不是.我猜这个手势首先被ScrollView检测到,并没有传播到它的优先级,但我不知道如何解决它.
这是我的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<ImageView android:layout_width="320dp" android:layout_height="30dp"
android:src="@drawable/header"/>
<ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content">
<!-- stuff -->
</ScrollView>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我将以下监听器设置为我的布局:
class ProductGestureListener extends SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
final int SWIPE_MIN_DISTANCE = 120;
final int SWIPE_MAX_OFF_PATH = 250;
final int SWIPE_THRESHOLD_VELOCITY = 200;
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false; …Run Code Online (Sandbox Code Playgroud) 所以我的活动有一个主ViewPager,在ViewPager里面,每个页面都有一个ScrollView的内容,在ScrollView内部还有另一个ViewPager.
这可能听起来很疯狂,但基本上外部ViewPager包含新闻文章,文章很长,所以有一个ScrollView,在ScrollView内部有多个缩略图/图片,他们也可以刷过.
我尝试过一些不同的自定义ViewPagers,它们具有不同的触摸事件拦截功能但似乎无法完美呈现.它要么完全吸收所有触摸事件,要么ScrollView的垂直滚动在该区域不起作用,否则将使内部水平滚动非常敏感/困难.
有人有完美的解决方案吗?
我正在尝试为水平实现类似ViewPager的行为RecyclerView.来自适配器的数据应该正常膨胀和绑定,但是Recycler应该以不同方式处理通过它的导航.当用户滑动(或尝试滚动)时,我Recycler向该方向移动一个项目,将其粘贴到左侧.
我已经拥有了所有项目转换逻辑.我正在使用一个自定义LayoutManager,它覆盖onSmoothScrollToPosition()了一个自定义LinearSmoothScroller()项目,左边的项目粘贴.
问题是 - 如何覆盖RecyclerView滑动的滚动行为并自己处理它们?我尝试禁用滚动LayoutManager然后拦截手势onTouchListener,但这似乎不起作用.RecyclerView框架是否有一个干净的方法来处理这个问题?
我必须在scrollview中显示一个viewpager(在pager行中的图像下方的图像和文本).我正在从网上下载图像,文本并在寻呼机行中显示.我在srollview中包含了viewpager以支持横向模式.
<com.xxx.myapp.android.ui.CustomScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:fadingEdge="none"
android:fillViewport="true"
android:gravity="center">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="800dp"
android:layout_gravity="top"
android:layout_marginTop="10dp" />
</LinearLayout>
</com.xxx.myapp.android.ui.CustomScrollView>
Run Code Online (Sandbox Code Playgroud)
这是CustomScrollView.问题是如何根据子高度设置视图寻呼机高度,以便我可以滚动屏幕直到视图寻呼机项目结束.如果我将view pager height设置为wrapcontent,则viewpager中不会显示任何内容.如果我设置了800dp,那么我可以看到寻呼机项目,但屏幕上有不必要的滚动.我不希望我的滚动视图滚动超出寻呼机儿童的高度.请帮我.
我们有和app有滚动视图,可以分页(左+右).
我们发现用户在尝试滑动(向左+向右)时会继续滚动(向上或向下),特别是当单手使用手机并使用拇指滑动时.
通过物理实验,上升和下降动作似乎比我们想要的更早开始,即切断点似乎是
| DY | > | dx | =>上下行动
| DY | <| dx | =>左右动作
我想知道是否可以更改滑动动作,这样我们只会在说dy> 1.4*dx时向上和向下滚动,即在垂直平面上使攻角明显更大.
我希望上述内容有道理.
我想我可能需要拦截手势,只能通过符合我更严格标准的那些手势来传递给底层视图.