如何在C# (Xamarin)中使用setOnTouchListener?

17

你能给我一个在C#中使用setOnTouchListener的例子吗?

我尝试了如下代码,但是出现了一些错误。

Button1.setOnTouchListener(new View.OnTouchListener()
    {
        public boolean onTouch(View arg0, MotionEvent arg1)
        {
            x.Text = "1";
        }
    });
2个回答

39

您可以选择使用Touch事件:

button1.Touch += (s, e) =>
{
    var handled = false;
    if (e.Event.Action == MotionEventActions.Down)
    {
        // do stuff
        handled = true;
    }
    else if (e.Event.Action == MotionEventActions.Up)
    {
        // do other stuff
        handled = true;
    }

    e.Handled = handled;
};

或者您可以显式实现 IOnTouchListener 接口(C# 没有匿名类)。请注意,在实现 Java 接口时,您还需要从 Java.Lang.Object 继承,因为我们需要一个处理 Java 方面的句柄(在使用 Touch 事件时不需要这样做)。

public class MyTouchListener 
    : Java.Lang.Object
    , View.IOnTouchListener
{
    public bool OnTouch(View v, MotionEvent e)
    {
        if (e.Action == MotionEventActions.Down)
        {
            // do stuff
            return true;
        }
        if (e.Action == MotionEventActions.Up)
        {
            // do other stuff
            return true;
        }

        return false;
    }
}

然后使用以下设置:

button1.SetOnTouchListener(new MyTouchListener());

注意,使用后一种方法还需要您处理将要修改的对象的引用传递给OnTouchListener类,而在C#事件中则不需要这样做。

编辑:另外,请注意,如果您使用Touch事件或任何其他事件,请记得成为一个好公民并在您不再需要接收它时取消挂钩该事件。最坏的情况是,如果您忘记取消挂钩事件,则会泄漏内存,因为实例无法清除。

因此,在第一个示例中,不要使用匿名方法:

button1.Touch += OnButtonTouched;

记得要解开它:

button1.Touch -= OnButtonTouched;

完美……!但我注意到这里只有少数人是大师..哈哈 - GvSharma
@Cheesebaron 有没有办法记录视图的触摸事件,当用户触摸该视图的任何子视图时? - vignesh kumar
@vigneshkumar 不太确定你的意思。这可能需要一个新的SO问题,并提供更多细节 :) - Cheesebaron

-1
private Button Button1;

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

    Button1.setOnTouchListener(new OnTouchListener()
    {
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            if (event.getAction() == MotionEvent.ACTION_DOWN)
            {
                //do stuff
            }
            else if (event.getAction() == MotionEvent.ACTION_UP)
            {
                // do stuff
            }
            return false;
        }
    });
}

根据你提出的另一个问题,我猜测你需要将onTouch监听器移动到onCreate方法中。


请仅返回翻译后的文本: 请显示所有错误以及onCreate方法 - 编辑您的问题 - Rob85
我已编辑了我的答案-请参见上文。你可能正在尝试直接从onCreate方法外部调用onTouchListener,除非你将它保留在另一个仍然从OnCreate调用的方法中,否则这是行不通的。 - Rob85
是的,看起来你需要按照上面所描述的移动方法。另外,你直接复制了我的代码并使用了Button1,我已经更新了我的代码以使用Button1而不是Button。 - Rob85
请检查您的“}”符号,看起来您可能有一个多余的或需要在某个地方添加一个。如果您仍然遇到困难,请发布完整文件。 - Rob85
请参考CheeseBarron上面的评论,关于继承Java类的问题。我假设你已经完成了这个步骤,因为你正在使用Java接口和C#。+1 @CheeseBarron - Rob85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接