View.OnTouchListener 触碰事件

本文探讨了Android开发中View.OnTouchListener接口的应用,通过实例演示如何利用MotionEvent对象获取触摸位置坐标,并对比View.OnClickListener的区别。
开发Anroid软件的过程中,一开始会遇到成吨出现的问题。比如说,我照猫画虎的实现了View.OnClickLinstener事件,可以点击一个Button按钮,浏览事前定义好的图片了。
但我突发奇想,可不可以自定义一个手势,别人不知道的手势,念咒语一样,在自己的手机上面一划,出现一些我想要的效果呢。。。

成吨的问题就出现了。。。。。。
这篇文章不打算攻克Gesture,先摸索一下View.OnTouchListener。实现一个例子就好。
帮助文档是这样描述的:
Public Methods
public abstract boolean onTouch (View v, MotionEvent event)

Called when a touch event is dispatched to a view. This allows listeners to get a chance to respond before the target view.

Parameters
v   The view the touch event has been dispatched to.
***event    The MotionEvent object containing full information about the event.***
Returns

    True if the listener has consumed the event, false otherwise. 

这个方法有两个参数,第一个参数View v很好理解,就是需要绑定的事件源(比如说点击一下一个按钮,这个按钮就是这个点击事件的事件源头)。
令我困惑的是参数MotionEvent event,这是个什么东西?英文还是能看懂的,说是这个MotionEvent 对象包含event所有的信息。
新手开发Android,一开始会遇到成吨的问题。。。那么问题就来了,这个event实例会包含哪些信息呢?这些信息一般会起到什么作用呢? 
于是又点进去看看,到底这个MotionEvent 是个什么鬼类!!

帮助文档是这么说的:
Object used to report movement (mouse, pen, finger, trackball) events. Motion events may hold either absolute or relative movements and other data, depending on the type of device. 也就是说,MotionEvent这个类的对象,可能会持有绝对或者相对运动以及其他数据....这个要取决于你设备的类型.....
Motion events describe movements in terms of an action code and a set of axis values.对象会给出轴值的集合...

帮助文档下面就是一堆鬼。。。打死不看!!!
反正现在知道了,MotionEvent这个类的对象,会包含这个event的所有信息,至少会包含一些轴值,比如说X,Y轴值。

蛋了个疼,那么就写个例子来看看,当TouchEvent事件发生时,能不能得到轴值。

布局文件代码:很简单,一个ImageView,一个TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:id="@+id/root"
    >

    <ImageView
        android:id="@+id/picture"
        android:layout_width="wrap_content"
        android:layout_height="360dp"
        android:src="@drawable/meinv"/>

    <TextView
        android:id="@+id/info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="坐标信息"/>
</LinearLayout>

主程序代码:

public class MainActivity extends AppCompatActivity {

    //声明TextView、ImageView对象
    private TextView info = null;
    private ImageView pictrue = null;

    //定义一个图片资源
    int luonv = R.drawable.meinv2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取TextView、ImageView对象
        info = (TextView) findViewById(R.id.info);
        pictrue = (ImageView) findViewById(R.id.picture);

        //注册onTouch监听器
        pictrue.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                // event.getX获取X坐标; event.getY获取Y坐标
                String perinfo = "X=" + String.valueOf(motionEvent.getX() +
                                " Y=" + String.valueOf(motionEvent.getY()));
                info.setText(perinfo);
                pictrue.setImageResource(luonv);
                return true;
            }
        });

    }
}
程序中用到的图片资源,自己随便照两张,丢到res/drawable目录下面去就可以了。
将程序安装到手机上,点击图片时,有两个效果,一是图片切换了一张,这是由于代码picture.setImageResource(luonv);二是文本框给出了touch事件发生处的X Y 轴值。


小结一下,View.OnTouchListener是个蛋疼的interface既接口,使用它的时候,必须要重写它的方法,重写publi abstract boolean onTouch(View v, MotionEvent event)方法中,就要知道event包含了什么东西。
尤其是更View.OnClickListener对比,查同样是接口类View.OnClickListener的方法便知,它的方法是这样定义的:
public abstract void onClick(View v),注意到只有一个参数。这里就没有event了!所以若想知道事件的一些信息,根据这些信息来选择要执行响应的代码,应该选用View.OnTouchListener.



妈的,成吨的问题。。。有个老司机带带路就好了。。。
Android 开发中,View事件处理机制是理解用户交互行为的核心部分。事件处理主要包括点击事件(如 `onTouchEvent`)、点击监听器(如 `OnClickListener`)以及事件分发机制。以下是对 Android View 事件处理机制的详细解析。 ### 事件分发机制 Android事件分发机制主要涉及三个核心方法: - `dispatchTouchEvent(MotionEvent event)`:负责事件的分发,决定是否将事件传递给当前 View 或其子 View。 - `onInterceptTouchEvent(MotionEvent event)`:仅存在于 `ViewGroup` 中,用于判断是否拦截事件,阻止子 View 接收事件。 - `onTouchEvent(MotionEvent event)`:处理事件的具体逻辑,如点击、滑动等操作。 事件的传递流程通常遵循以下顺序: 1. **Activity 的 `dispatchTouchEvent`**:作为事件分发的起点,将事件传递给最外层的 `ViewGroup`。 2. **ViewGroup 的 `dispatchTouchEvent`**:决定是否拦截事件或继续向下分发给子 View。 3. **View 的 `onTouchEvent`**:处理具体的事件逻辑,如点击或滑动。 ### 点击事件的处理流程 点击事件的处理流程可以分为以下几个步骤: 1. **事件的捕获**:用户触碰屏幕时,系统生成一个 `MotionEvent` 对象,表示触摸事件。 2. **事件的分发**:从 `Activity` 开始,通过 `dispatchTouchEvent` 方法将事件传递给最外层的 `ViewGroup`。 3. **事件的拦截**:`ViewGroup` 通过 `onInterceptTouchEvent` 方法决定是否拦截事件,阻止子 View 接收事件。 4. **事件的消费**:如果事件未被拦截,则传递给子 View,子 View 通过 `onTouchEvent` 方法处理事件。 5. **事件的回传**:如果子 View 未消费事件,则事件会回传给父 View 或 `Activity`。 ### 代码示例 以下是一个简单的代码示例,展示了如何在自定义 View 中处理触摸事件: ```java public class CustomView extends View { public CustomView(Context context) { super(context); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 处理按下事件 Log.d("CustomView", "ACTION_DOWN"); return true; // 返回 true 表示事件已被消费 case MotionEvent.ACTION_MOVE: // 处理移动事件 Log.d("CustomView", "ACTION_MOVE"); return true; case MotionEvent.ACTION_UP: // 处理抬起事件 Log.d("CustomView", "ACTION_UP"); return true; default: return super.onTouchEvent(event); } } } ``` ### 事件处理的优先级 在 Android 中,事件处理的优先级遵循以下规则: - **OnTouchListener**:优先于 `onTouchEvent` 方法,如果 View 设置了 `OnTouchListener`,则会首先调用该监听器。 - **OnClickListener**:只有在 `onTouchEvent` 方法中处理了 `ACTION_UP` 事件时,`OnClickListener` 才会被触发。 ### 事件处理的注意事项 1. **避免事件冲突**:在复杂的 UI 结构中,多个 View 可能会同时处理相同的事件,导致冲突。可以通过 `requestDisallowInterceptTouchEvent` 方法解决此类问题。 2. **性能优化**:避免在 `onTouchEvent` 方法中执行耗时操作,以免影响用户体验。 3. **事件的消费**:确保事件在适当的时机被消费,避免事件被重复处理或遗漏。 通过理解 Android View事件处理机制,开发者可以更好地控制用户交互行为,实现更复杂的 UI 功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值