• 基于回调的事件处理——重写onTouchEvent方法响应触摸屏事件


          对于Android提供的事件处理模型,不难发现基于监听的事件处理模型具有更大的优势:

    • 基于监听的事件模型分工更加明确,事件源、事件监听有两个类分开实现,因此具有更好的维护性。
    • Android的事件处理机制保证基于基于监听的事件监听器会被优先触发。

          实例:通过回调实现跟随手指的小球       

           在某些特定情况下,基于回调的事件处理机制会更好地提高程序的内聚性,例如上一章的实例;跟随手指的小球,如果改为基于回调的实现,可以更好的提高程序的内聚性。

           例如将该实例中的DrawView类改为如下形式。

          

    package com.example.studyevent;
    
    import java.text.AttributedCharacterIterator.Attribute;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    
    public class DrawView extends View {
        public float currentX=40;
        public float currentY=50;
        //定义、创建画笔
        Paint p=new Paint();
        public DrawView(Context context,AttributeSet set) {
            super(context,set);
            // TODO Auto-generated constructor stub
        }
        @Override
        public void onDraw(Canvas canvas)
        {
            super.onDraw(canvas);
            //设置画笔的颜色
            p.setColor(Color.RED);
            //绘制一个小球(作为小球)
            canvas.drawCircle(currentX, currentY, 15, p);
        }
        @Override
        public boolean onTouchEvent(MotionEvent event)
        {
            //当前组件的currentX、currentY两个属性
            this.currentX=event.getX();
            this.currentY=event.getY();
            //通知该组件重绘
            this.invalidate();
            //返回true表明处理方法已经处理该事件
            return true;
            
        }
        
    }

    上面的程序中粗体字代码重写了View组件的onTouchEvent(MotionEvent event)方法,这表示该组件就可以处理触摸屏事件,当用户手指在屏幕上移动时,该View上绘制的小球将会跟随用户手指。也就是说,这个自定义View本身就可以很好的处理屏幕事件。
         接下来在程序中使用这个DrawView几乎不需增加任何处理,直接将View放到界面布局中即可。如下面界面布局中的XML文件所示。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
       >
       <!-- 使用自定义组件 -->
       <com.example.studyevent.DrawView 
           android:orientation="vertical"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"/>
    </LinearLayout>

        接下来Activity类中不需要为该View绑定事件监听器——因为该View自己就可以处理它的触摸屏事件。

         运行上面程序将看到下图所示效果:

        通过为View提供事件处理的回调方法,可以很好地把事件处理方法封装在该View内部,从而提高程序的内聚性——基于回调的事件处理更适合于应付那种事件处理逻辑比价固定的View,比如上面介绍的这个跟随用户手指的View。

  • 相关阅读:
    方法引用
    day2
    柯朗数(Courant number)研究
    Socket网络编程学习一
    自制导航
    HighChart 体验之旅 (后台传递JSON参数和数据的方法)
    HighChart体验之旅2 对HighChart控件的再次封装
    委托学习小计
    面试常用SQL整理
    动态LINQ(Lambda表达式)构建
  • 原文地址:https://www.cnblogs.com/wolipengbo/p/3408495.html
Copyright © 2020-2023  润新知