标签: android-touch-event

如果滚动位置为 0,ViewPager2 中的片段不会响应点击

我很高兴谷歌发布了基于 RecyclerView 构建的ViewPager2,解决了旧 ViewPager 存在的很多问题。

我很快将旧的 ViewPager 代码替换为 ViewPager2:

  1. 用 xml 中的 ViewPager2 替换 ViewPager

  2. 替换FragmentPagerAdapter(FragmentManager)FragmentStateAdapter(Fragment)

  3. ViewPager 设置如下:

    viewPager.adapter = fragmentAdapter
    
    val mediator = TabLayoutMediator(tabLayout, viewPager, true) { tab, position ->
        tab.text = fragmentAdapter.tabNames[position]
    }
    mediator.attach()
    
    Run Code Online (Sandbox Code Playgroud)

没有进行其他更改。

问题

执行上述更改后,我意识到一个问题——

现在我的 ViewPager 是一个普通的水平寻呼机,我的每个片段fragmentAdapter都有一个垂直的RecyclerView.

我观察到,当 RecyclerView 的滚动位置为 0 时,该 RecyclerView 中的项目无法接收任何单击或长按事件,但可以滚动。一旦滚动,它可以再次收到点击。*

知道这ViewPager2也是一个RecyclerView,是否与嵌套的 RecyclerView 有关系?

android android-viewpager android-recyclerview android-touch-event android-viewpager2

7
推荐指数
1
解决办法
2235
查看次数

在Android中的多个视图上同时触摸事件处理

考虑下图中的示例,

在此输入图像描述

我正在寻找一种解决方案,将触摸事件从画布View传递给Viewpager.这对于同时在两个视图上应用相同数量的缩放是必要的.

这是对正在发生的事情的技术描述,

(让我们将视图视为A,BC)

A.父母观点

B.观点

C.查看寻呼机

在子项(B&C)上调用dispatchTouchEvent()之前,A.dispatchTouchEvent()将首先调用A.onInterceptTouchEvent()以查看视图组是否有兴趣拦截事件.

因此,如果A.onTouchEvent()返回false,则返回到B.onTouchEvent().如果返回false,则返回到C.onTouchEvent()并继续照常调度.

返回真实时,

  1. ACTION_CANCEL将被派遣给所有孩子.

  2. 如果已定义,则事件侦听器(OnTouchListener.onTouch())将使用所有后续手势事件(直到ACTION_UP/ACTION_CANCEL),否则将在A级别使用事件处理程序A.onTouchEvent().

在这一点上我可以从父到子视图传递事件,但不能让孩子2视图.&C一起处理事件(在两个视图上应用相同数量的缩放).

有没有办法将触摸事件从父视图传递给子视图,以便他们可以同时处理事件?

这是我的布局设置,

<RelativeLayout
    android:id="@+id/layoutParent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFFFF">

            <com.androidapp.NonSwipeableViewPager
                android:id="@+id/pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:background="@color/transparent" />

            <com.androidapp.DrawingView
                android:id="@+id/drawing"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/transparent" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

android android-view android-viewpager android-touch-event

6
推荐指数
1
解决办法
2262
查看次数

滚动视图中水平回收器视图中的滚动问题

我的主页中有一个滚动视图,在该滚动视图中,每个回收视图的布局有 2 个布局,每个回收视图将水平滚动。当我尝试滚动 recyclerview 时,scrollview 的滚动会被干扰,并且 scrollview 开始在垂直方向滚动。所以我尝试了下面的代码。

mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        int action = e.getAction();
        switch (action) {
        case MotionEvent.ACTION_MOVE:
            rv.getParent().requestDisallowInterceptTouchEvent(true);
            break;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});
Run Code Online (Sandbox Code Playgroud)

然后我可以在触摸 recyclerview 时控制水平滚动,但是现在的问题是当我触摸 recyclerview 时我无法垂直滚动我的滚动视图。任何建议请。我的确切需求是我需要滚动视图,并且在滚动视图内部几乎没有回收器视图,它将像谷歌 Play 商店应用程序一样工作。

在此处输入图片说明

这是我的布局

<com.sothree.slidinguppanel.SlidingUpPanelLayout
    android:id="@+id/sliding_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    sothree:umanoPanelHeight="368dp"
    sothree:umanoParallaxOffset="2dp"
    sothree:umanoOverlay="false"
    android:gravity="bottom"
    sothree:umanoFadeColor="#00000000"
    sothree:umanoDragView="@+id/dragView"
    sothree:umanoScrollableView="@+id/svScroll"
    sothree:umanoShadowHeight="0dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

    </LinearLayout>

    <LinearLayout
        android:id="@+id/dragView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" …
Run Code Online (Sandbox Code Playgroud)

android gesture android-scrollview android-recyclerview android-touch-event

6
推荐指数
1
解决办法
5320
查看次数

如何使用自定义项适配器在ListFragment中实现右键滑动?

我需要的是检测项目的正确滑动并显示一些活动.我做了上一个.调查,但似乎没有明显的正确解决方案.请帮我.

我的代码如下.

public class FragmentTwo extends ListFragment  {

    public FragmentTwo() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_fragment_two, container, false);

        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        ListView listView = getListView();

        listView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_UP){

                    Toast.makeText(getContext(),"ACTION_UP", Toast.LENGTH_SHORT).show();
                    return true;
                }

                if(event.getAction() == MotionEvent.ACTION_DOWN){

                    Toast.makeText(getContext(),"ACTION_DOWN", Toast.LENGTH_SHORT).show();
                    return true;
                }

                if(event.getAction() == MotionEvent.ACTION_MOVE){

                    Toast.makeText(getContext(),"ACTION_MOVE", Toast.LENGTH_SHORT).show();
                    return true;
                }

                return false;
            } …
Run Code Online (Sandbox Code Playgroud)

java android android-listfragment android-touch-event android-swipe

6
推荐指数
3
解决办法
595
查看次数

如何在不抬起手指(Action.UP或取消)的情况下撤销`requestDisallowInterceptTouchEvent(false)`?

我在WebView里面RecyclerView.为了获得平滑的滚动体验,当用户滚动时,RecyclerView将负责滚动(WebView不应滚动)当我只有一个触摸点并且正在垂直移动(向上和向下滚动)时我调用getParent().requestDisallowInterceptTouchEvent(false);内部webview#onTouchEvent(event).

private void handleSingleFingerTouch(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                x1 = ev.getX();
                y1 = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                x2 = ev.getX();
                y2 = ev.getY();
                // -ve param for canScrollHorizontally is to check scroll left. +ve otherwise
                if (Math.abs(x1 - x2) >= Math.abs(y1 - y2)
                        && canScrollHorizontally((int) (x1 - x2))) {
                    // scrolling horizontally. Retain the touch inside the webView.
                    getParent().requestDisallowInterceptTouchEvent(true);
                } else {
                    // scrolling vertically. …
Run Code Online (Sandbox Code Playgroud)

android ontouchlistener android-webview android-recyclerview android-touch-event

6
推荐指数
1
解决办法
353
查看次数

如何使用 Compose 将触摸事件传递给底层组件?

我正在寻找创建调试功能。这是一个简化的表示:

@Composable
fun DebugLogOverlay(logs: List<String>){  
    LazyColumn(
        modifier = Modifier
            .background(
                color = Colors.White.copy(alpha = 0.3F)
            )
    ){
        items(logs){ log ->
            ListItem(
                text = { Text(log) }
            )
        }
    }  
}
Run Code Online (Sandbox Code Playgroud)

目标是覆盖但不干扰应用程序。有没有办法做到这一点?我正在寻找类似于 Flutter 的 IgnorePointer 的东西,但是使用 Compose?https://api.flutter.dev/flutter/widgets/IgnorePointer-class.html

android android-touch-event android-jetpack-compose

6
推荐指数
1
解决办法
911
查看次数

找出哪个 View 消耗了触摸事件(如果有)

我正在解决一个与视图相关的问题:一个点击监听器在它应该触发的时候没有被触发。经过长时间的反复试验,我发现父视图被禁用,因此将所有事件丢弃给其子视图。

在 Android 中,有没有一种方法可以准确地找到将触摸或点击事件注入应用程序时会发生什么?比如它是如何调度的,它遍历了哪些视图,谁忽略了它(以及为什么),谁丢弃了它(以及为什么),最后是谁消费了它。

理想情况下,它会在应用程序中的每次点击时发出 Logcat 上的某种低级转储。

android android-custom-view android-view motionevent android-touch-event

5
推荐指数
1
解决办法
1196
查看次数

ViewPager2 里面有水平滚动视图

我为我的项目实现了新的 ViewPager。viewPager2 包含一个片段列表

 private class ViewPagerAdapter extends FragmentStateAdapter {

    private ArrayList<Integer> classifiedIds;

    ViewPagerAdapter(@NonNull Fragment fragment, final ArrayList<Integer> classifiedIds) {
        super(fragment);
        this.classifiedIds = classifiedIds;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return DetailsFragment.newInstance(classifiedIds.get(position));
    }

    @Override
    public int getItemCount() {
        return classifiedIds.size();
    }
}
Run Code Online (Sandbox Code Playgroud)

在片段内部我得到了一个水平的 recyclerView

LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
recyclerViewPicture.setLayoutManager(layoutManager);
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试滚动 recyclerview 时,viewPager 触摸并切换到下一个片段

当我使用旧的 ViewPager 时,我没有这个问题

android android-recyclerview android-touch-event android-viewpager2

5
推荐指数
2
解决办法
7084
查看次数

Android - 如何检测屏幕上的触摸是一种"滚动"触摸?

我正在用Java创建一个Android应用程序,我<TextView>在屏幕上有很多,所有这些都定义了onTouchListeners.它们被包裹在一起,<ScrollView>因为它们占据的空间比屏幕上的空间大.

我的问题是:当我向上/向下滚动应用程序时,通过触摸屏幕并向上/向下移动我的手指,滚动按预期工作,但触摸的onTouchListener <TextView>也被触发(这也可能是预期的) -我不希望这发生.我想在触摸屏幕滚动它时忽略onTouchListener.

我怎么能做到这一点?我不想让我的函数在用户滚动时运行,并且"意外地"触发某个onTouchListener <TextView>.

java android android-scrollview android-touch-event

4
推荐指数
1
解决办法
9606
查看次数

双击:放大Android MapView?

经过一些工作,我的路线应用程序工作正常.我唯一想要添加的是双击放大功能,但我不知道如何.

你能给我一个暗示吗?

java android android-view android-mapview android-touch-event

2
推荐指数
1
解决办法
1万
查看次数