Android - 监听事件笔记代码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、连续点击事件监听

        TextView bts = (TextView) findViewById(R.id.bts);
        bts.setOnClickListener(new View.OnClickListener() {
            long[] mHints = new long[5];//点击5次,长度为5
            @Override
            public void onClick(View v) {
                System.arraycopy(mHints, 1, mHints, 0, mHints.length - 1);
                mHints[mHints.length - 1] = SystemClock.uptimeMillis();
                if (SystemClock.uptimeMillis() - mHints[0] <= 3000){    //判断点击5次的总时间小于3秒
                    Toast.makeText(getApplicationContext(), "当你点击5次之后才会出现", Toast.LENGTH_SHORT).show();
                }

            }
        });

二、长按事件监听

第一种方法自定义长按事件,可设置长按时间

第一步创建一个类
LongClickUtils.java

import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;

public class CustomLongClick{
    private static final String TAG = "CustomLongClick";
    /**
     * handler           外界handler(为了减少handler的泛滥使用,最好全局传handler引用,如果没有就直接传 new Handler())
     * longClickView     被长按的视图(任意控件)
     * delayMillis       长按时间,毫秒
     * longClickListener 长按回调的返回事件
     */
    public static void setLongClick(final Handler handler, final View longClickView, final long delayMillis, final View.OnLongClickListener longClickListener) {
        longClickView.setOnTouchListener(new View.OnTouchListener() {
            private int TOUCH_MAX = 50;
            private int mLastMotionX;
            private int mLastMotionY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int x = (int) event.getX();
                int y = (int) event.getY();

                switch (event.getAction()) {
                    case MotionEvent.ACTION_UP:
                        // 抬起时,移除已有Runnable回调,抬起就算长按了(不需要考虑用户是否长按了超过预设的时间)
                        handler.removeCallbacks(r);
                        break;
                    case MotionEvent.ACTION_MOVE:
                        if (Math.abs(mLastMotionX - x) > TOUCH_MAX
                                || Math.abs(mLastMotionY - y) > TOUCH_MAX) {
                            // 移动误差阈值
                            // xy方向判断
                            // 移动超过阈值,则表示移动了,就不是长按,移除 已有的Runnable回调
                            handler.removeCallbacks(r);
                        }
                        break;
                    case MotionEvent.ACTION_DOWN:
                        // 每次按下重新计时
                        // 按下前,先移除 已有的Runnable回调,防止用户多次单击导致多次回调长按事件的bug
                        handler.removeCallbacks(r);
                        mLastMotionX = x;
                        mLastMotionY = y;
                        // 按下时,开始计时
                        handler.postDelayed(r, delayMillis);
                        break;
                }
                return true;
            }

            private Runnable r = new Runnable() {
                @Override
                public void run() {
                    if (longClickListener != null) {// 回调给用户,用户可能传null,需要判断null
                        longClickListener.onLongClick(longClickView);
                    }
                }
            };
        });
    }
}

第二步调用
MainActivity.java中调用

TextView bts = (TextView) findViewById(R.id.bts);
CustomLongClick.setLongClick(new Handler(), bts, 5000, new View.OnLongClickListener() {
	@Override
    public boolean onLongClick(View v) {
    	if(v == bts){
        	Toast.makeText(getApplicationContext(), "当你长按5秒之后才会出现", Toast.LENGTH_SHORT).show();
         }
         return true;
     }
});

第二种方法,使用系统长按事件

TextView bts = (TextView) findViewById(R.id.bts);
bts.setOnLongClickListener(new View.OnLongClickListener(){
	@Override
	public boolean onLongClick(View v) {
		if(v == bts){
			Toast.makeText(getApplicationContext(), "当你长按之后才会出现", Toast.LENGTH_SHORT).show();
         }
         return false;
     }
});

三、屏幕触摸事件处理

对指定的控件监听屏幕触摸事件

TextView im = (TextView)findViewById(R.id.tex);
im.setOnTouchListener(new View.OnTouchListener() {
	//onTouch方法响应触摸事件
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    //判断是否为按下事件
    	if(event.getAction() == MotionEvent.ACTION_DOWN){
        	im.setText("按下");
        }
        //判断是否为移动事件
        if(event.getAction() == MotionEvent.ACTION_MOVE){
             im.setText("滑动");
        }
        //判断是否为弹起事件
        if(event.getAction() == MotionEvent.ACTION_UP){
        	im.setText("基于监听的单点触摸响应");
        }
        return true;
	}
});

监听详细的触摸事件

TextView im = (TextView) findViewById(R.id.aat);
im.setOnTouchListener(new View.OnTouchListener() {
	@Override
    public boolean onTouch(View view, MotionEvent event) {
    	switch (event.getAction() & MotionEvent.ACTION_MASK) {
        	// 单指
            case MotionEvent.ACTION_DOWN:
            	sa.setText("单指触碰");
                d = 1;
            	break;
            	
            // 双指
            case MotionEvent.ACTION_POINTER_DOWN:
                sa.setText("双指触碰");
                d += 1;
                break;
                
           	// 手指放开
            case MotionEvent.ACTION_UP:
            	sa.setText("最后一个手指放开放开");
                d = 0;
                break;

           	case MotionEvent.ACTION_POINTER_UP:
            	sa.setText("双指放开");
                d -= 1;
                break;

            // 滑动事件
            case MotionEvent.ACTION_MOVE:
            	if (d == 1) {
                	// 是一个手指拖动
                    sa.setText("单指滑动");
                } else if (d > 1) {
                    // 两个手指滑动
                    sa.setText(d + "指滑动");
                } else {
                    sa.setText("无触摸");
                }
                break;
            }
        	return true;
    	}
	});
}

四、屏幕手势事件处理

1.新建一个类GesTurel实现GestureDetector.OnGestureListener

import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.TextView;

public class GesTurel implements GestureDetector.OnGestureListener {
    TextView txtt;
    public GesTurel(TextView txtt) {
        this.txtt = txtt;
    }
    //刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
    @Override
    public boolean onDown(MotionEvent motionEvent) {
        txtt.setText("手指接触到屏幕");
        return false;
    }

    //手指按在触摸屏上,它的时间范围在按下起效,在长按之前
    @Override
    public void onShowPress(MotionEvent motionEvent) {
        txtt.setText("手指按住了屏幕");
    }

    //手指离开触摸屏的那一刹那
    @Override
    public boolean onSingleTapUp(MotionEvent motionEvent) {
        txtt.setText("手指离开屏幕");
        return false;
    }

    // 手指在触摸屏上滑动。
    @Override
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        txtt.setText("手指正在滑动");
        return false;
    }

    //手指按在持续一段时间,并且没有松开。
    @Override
    public void onLongPress(MotionEvent motionEvent) {
        txtt.setText("手指按住很久了");
    }

    //手指在触摸屏上迅速移动,并松开的动作。
    @Override
    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        txtt.setText("迅速滑动");
        return false;
    }
}

2.调用监听
MainActivity.java

public class MainActivity extends AppCompatActivity {

    GesTurel gl;
    GestureDetector de;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView txtt = (TextView)findViewById(R.id.sh_tx);
        //实例化手势监听对象和手势识别对象
        gl = new GesTurel(txtt);        //手势监听器
        de = new GestureDetector(this, gl);     //手势识别,GestureDetector为系统提供的手势识别类
    }

	//将TouchEvent事件传给手势识别对象
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return de.onTouchEvent(event);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Studio是一个流行的开发环境,用于开发Android应用程序。监听事件是用于处理用户交互,例如点击、滑动、触摸等事件。在Android Studio中,可以使用各种监听事件来响应用户的行为,从而在应用程序中执行相应的操作。 以下是一些常用的Android Studio监听事件: 1. 点击事件(OnClickListener):当用户点击一个按钮、文本框或其他可点击的元素时触发。 2. 触摸事件(OnTouchListener):当用户在屏幕上移动或按下/释放手指时触发。 3. 滑动事件(OnSwipeListener):当用户滑动屏幕时触发,通常用于切换页面或卡片。 4. 焦点事件(OnFocusChangeListener):当一个控件获得或失去焦点时触发。 5. 菜单事件(OnMenuItemClickListener):当用户在菜单中点击一个菜单项时触发。 6. 计时器事件(TimerTask):使用计时器来定期执行任务,例如更新UI或执行后台任务。 7. 生命周期事件(LifecycleListeners):使用生命周期回调方法来响应应用程序的生命周期变化,例如Activity的创建、销毁和重启。 要使用这些监听事件,可以在相应的控件上设置相应的监听器,或者使用Java或Kotlin中的相应接口和类来实现。在监听事件的处理方法中,可以执行所需的逻辑,例如更新UI、执行网络请求或保存数据。 需要注意的是,监听事件的使用取决于具体的需求和场景,因此选择适当的监听事件非常重要。同时,还应该考虑到性能和用户体验的影响,避免过度使用和滥用监听事件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值