You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确重写System类中View的OnTouchEvent并修正类型转换?

修正类型转换错误,实现自定义View触摸逻辑

你的代码里有两个明显的问题导致类型转换失败:

  1. 你写了MyView mv = (MyView)mv;——这是个低级错误,变量自己转换自己,完全没有意义;
  2. 核心问题:base.GetCellCore()返回的是系统原生的View对象,它并不是你自定义的MyView子类实例,强行类型转换必然会抛出InvalidCastException。

要实现自定义触摸逻辑,正确的思路是在重写的GetCellCore方法中直接创建你自己的MyView实例并返回,而不是试图转换系统返回的View。修正后的代码如下:

public class MyClass : SystemClass { 
    public override View GetCellCore(/* 填入原方法的参数列表 */) { 
        // 根据GetCellCore方法的参数,调用MyView对应的构造函数
        // 比如如果原方法参数是Context context,就对应调用MyView的Context构造
        MyView customView = new MyView(/* 传入匹配的构造参数 */); 
        return customView; 
    } 

    private class MyView : View { 
        // 必须实现和父类View完全一致的5个构造函数,每个构造函数都要调用base的对应构造
        public MyView(Context context) : base(context) {}
        public MyView(Context context, AttributeSet attrs) : base(context, attrs) {}
        public MyView(Context context, AttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr) {}
        public MyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) : base(context, attrs, defStyleAttr, defStyleRes) {}
        // 如果还有其他构造函数,同理实现

        public override bool OnTouchEvent(MotionEvent e) { 
            // 在这里编写你的自定义触摸逻辑
            HandleCustomTouch(e);
            
            // 可选:如果需要保留父类的触摸处理逻辑,就调用base方法并返回其结果
            // return base.OnTouchEvent(e);
            
            // 如果完全自定义触摸行为,返回你自己的布尔值(true表示已处理事件,false表示未处理)
            return true; 
        }

        private void HandleCustomTouch(MotionEvent e) {
            // 示例:处理不同的触摸动作
            switch(e.Action) {
                case MotionEvent.ACTION_DOWN:
                    // 按下时的操作
                    break;
                case MotionEvent.ACTION_MOVE:
                    // 滑动时的操作
                    break;
                case MotionEvent.ACTION_UP:
                    // 抬起时的操作
                    break;
            }
        }
    } 
}

如果你的业务场景必须复用base.GetCellCore()返回的View的某些状态或功能,那单纯继承的方式就不适用了,可以考虑使用装饰器模式:创建一个包装类持有系统View的引用,将触摸事件转发给自定义逻辑,但这种场景在Android开发中相对少见。绝大多数情况下,直接创建自定义MyView实例返回是最简洁有效的解决方案。

内容的提问来源于stack exchange,提问作者LuizLoyola

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:38:18