将触摸事件传递到父视图

如何解决将触摸事件传递到父视图

| 我有一个自定义“ 0”,在其中实现了触摸事件,所以我 能够使用触摸屏在屏幕上滚动。 我的布局层次结构如下所示:
<ViewSwitcher>

    <LinearLayout>
        <ListView />
    </LinearLayout>

    <LinearLayout>
        <ListView />
    </LinearLayout>

</ViewSwitcher>
现在的问题是触摸事件正在被
ListViews
,无法切换视图。当我工作正常 没有
ListViews
。我需要能够滚动浏览 查看并滚动
ListView
。 我该如何解决? 编辑:我还需要
ListView
项目才能单击。 提前致谢!     

解决方法

        谢谢大家回答这个问题。但是我能够以一种简单得多的方式解决它。由于我的“ 0”没有检测到触摸事件,因此我拦截了名为“ 7”的触摸事件并返回了“ 8”。这里:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
    onTouchEvent(ev);
    return false;
}
通过覆盖ѭ10,我可以拦截活动中的触摸事件。然后我在
ViewSwitcher
中调用了
onTouchEvent()
来处理
ListViews
的切换。最后,通过返回
false
,确保
ViewGroup
不会消耗事件。     ,        将子视图的TouchEvent传递到父视图的最简单方法是将其添加到子视图:
@Override
public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event);
    return false;
}
    ,        在我的父级布局中,我发现阻止孩子捕获触摸事件的唯一方法是重写onInterceptTouchEvent以返回true。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
    return true;
}
    ,        我认为您没有简便的方法可以做到这一点。 并没有那么复杂,但是您将需要创建自己的扩展ListView的视图。然后,您可以覆盖
onTouch
处理函数,并决定(取决于touch事件)是要处理它(并返回true)还是将其传递给父级View。 问题还在于,一旦视图处理了触摸事件,它将获取所有剩余的触摸事件。 从Android文档:   onTouch()-这将返回一个布尔值   指明您的听众   消耗此事件。重要的   事情是这个事件可以有   跟随每个动作   其他。因此,如果您在以下情况下返回false   收到向下动作事件,您   表示您还没有消耗   该事件,也没有兴趣   在此事件的后续操作中。   因此,您不会被要求任何   事件中的其他动作,例如   作为手指手势,或者最终   向上动作事件 因此,例如,如果您希望垂直移动以滚动列表并在同一触摸事件期间(不松开手指),则希望水平移动来切换视图,这将是非常具有挑战性的。 但是,如果您可以使用手势作为示例,或者在自定义视图中处理所有事情,并根据MotionEvent的不同,将命令发送到ViewSwitcher。     ,        您是否尝试过将ListView项设置为不可点击,如下所示:listView.setClickable(false);这应该向上推动click事件。     ,        如果您的视图要传递事件,请确保在onTouchEvent中返回false。否则,平台会认为您消耗了该事件,因此不需要进一步处理。     ,        我所做的是在viewswitcher的listview上设置一个toucheventlistener,处理事件,检测猛击动作,并调用viewswitcher的方法。有用。     ,        您也可以在
dispatchTouchEvent
中插入一个呼叫以处理
touchevent
,但是在这种情况下,您还必须覆盖
onTouchEvent
以返回true,否则将仅传递手势的第一个
MotionEvent
DOWN。 这是可触摸的包装容器:
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<view xmlns:android=\"http://schemas.android.com/apk/res/android\"
    android:id=\"@+id/pager\"
    android:layout_width=\"match_parent\"
    android:layout_height=\"match_parent\"
    class=\"com.example.myapp.FragmentContainer$TouchableWrapper\" />
和班级:
public static class TouchableWrapper extends FrameLayout {
    private GestureDetector gestureDetector;
    public void setGestureDetector(GestureDetector gestureDetector) {
        this.gestureDetector = gestureDetector;
    }

    // these constructors for the XML inflater
    public TouchableWrapper(Context context) {
        super(context);
    }
    public TouchableWrapper(Context context,AttributeSet attrs) {
        super(context,attrs);
    }
    public TouchableWrapper(Context context,AttributeSet attrs,int defStyle) {
        super(context,attrs,defStyle);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        Log.d(TAG,\"onInterceptTouchEvent \" + event.toString());
        return false; // true for intercept,false è default and pass on to children View
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.d(TAG,\"dispatchTouchEvent \" + event.toString());
        gestureDetector.onTouchEvent(event);
        return super.dispatchTouchEvent(event);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d(TAG,\"onTouchEvent \" + event.toString());
        return true; //return super.onTouchEvent(event); 
    }
}
这是“ 25”参考:
private GestureDetector gestureDetector;
GestureListener
private GestureDetector.SimpleOnGestureListener sOGL = new GestureDetector.SimpleOnGestureListener() {
    private static final int SWIPE_THRESHOLD = 100;
    private static final int SWIPE_VELOCITY_THRESHOLD = 100;

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY) {
        boolean result = false;
        try {
            float diffY = e2.getY() - e1.getY();
            float diffX = e2.getX() - e1.getX();
            if (Math.abs(diffX) > Math.abs(diffY)) {
                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffX > 0) {
                        goToRight(); // onSwipeRight();
                    } else {
                        goToLeft(); // onSwipeLeft();
                    }
                }
                result = true;
            } else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                if (diffY > 0) {
                    // onSwipeBottom();
                } else {
                    // onSwipeTop();
                }
            }
            result = true;

        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return result; // return false indicate event not handled
    }
};
使用此工具加载可触摸容器片段和包含的片段:
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    Log.d(TAG,\"onCreateView()\");
    View view = inflater.inflate(R.layout.fragmentcontainer,container,false);

    gestureDetector = new GestureDetector(view.getContext(),sOGL);
    ((FragmentContainer.TouchableWrapper) view).setGestureDetector(gestureDetector);

    FragmentManager fm = this.getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.pager,frag).commit();

    return view;
}
    ,        必须使用autoLink = \“ three \”处理父视图中TextView中的触摸 这样做:
private LinearLayout mParentView;
private TextView mTextView;
private View.OnTouchListener mParentListener = new OnTouchListener() {

    @Override
    public boolean onTouch(View v,MotionEvent event) {
        ......
        return false;
    }
};
mParentView.setOnTouchListener(mParentListener);

mTextView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v,MotionEvent event) {
        mParentListener.onTouch(mParentView,event);
        return false;
    }
};
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res