导航:首页 > 操作系统 > android按住事件

android按住事件

发布时间:2023-04-05 07:51:38

android框架 ImageButton如何实现 按住和松开时的事件

这个可以用onTouch来实现,touch事件有手指按下,移动,放开的相关api。

关于Touch事件的说明:

1.关于事件构成

在Android中,事件主要包括点按、长按、拖拽、滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作。所有这些都构成了Android中的事件响应。总的来说,所有的事件都由如下三个部分作为耐森基础:

1.按下(ACTION_DOWN)

2.移动(ACTION_MOVE)

3.抬起(ACTION_UP)

所有的操作事件首先必须执行的是按下操作(ACTIONDOWN),之后所有的操作都是以按下操作作为前提,当按下操作完成后,接下来可能是一段移动(ACTIONMOVE)然后抬起(ACTION_UP),或者是按下操作执行完成后没有移动就直接抬起。这一系列的动作在Android中都可以进行控制。


2.事件的处理API

在View和ViewGroup中都存在dispatchTouchEvent和onTouchEvent方法,但是在ViewGroup中还有一个onInterceptTouchEvent方法,在Android中,所有的事件都是从开始经过传递到完成事件的卜亩耐消费,这些方法的返回值就决定了某一事件是否是继续往下传,还是被拦截了,或是被消费了。

public boolean dispatchTouchEvent(MotionEvent event)
public boolean onTouchEvent(MotionEvent event)
public boolean onInterceptTouchEvent(MotionEvent event)


3.事件处理API的说明

  1. dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发,然后型春决定是自身消费当前事件还是继续往下分发给子控件处理。返回true表示不继续分发,事件没有被消费。返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。

  2. onTouchEvent方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。

  3. onInterceptTouchEvent是ViewGroup中才有的方法,View中没有,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。

⑵ Android开发中,长按事件怎么获得屏幕坐标点

对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射武器,结合Android Button模型,我们实现一个带图片的Button的长按,为了更清晰的显示原理,Android开发网这里使用ImageButton作为基类.
public class RepeatingImageButton extends ImageButton {
private long mStartTime; //记录长按开始
private int mRepeatCount; //重复次数计数
private RepeatListener mListener;
private long mInterval = 500; //Timer触发间隔,即每0.5秒算一次按下

public RepeatingImageButton(Context context) {
this(context, null);
}
public RepeatingImageButton(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.imageButtonStyle);
}
public RepeatingImageButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setFocusable(true); //允许获得焦点
setLongClickable(true); //启用长按事件
}

public void setRepeatListener(RepeatListener l, long interval) { //实现重复按下事件listener
mListener = l;
mInterval = interval;
}

@Override
public boolean performLongClick() {
mStartTime = SystemClock.elapsedRealtime();
mRepeatCount = 0;
post(mRepeater);
return true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) { // 本方法原理同onKeyUp的一样,这里处理屏幕事件,下面的onKeyUp处理Android手机上的物理按键事件
removeCallbacks(mRepeater);
if (mStartTime != 0) {
doRepeat(true);
mStartTime = 0;
}
}
return super.onTouchEvent(event);
}
//处理导航键事件的中键或轨迹球按下事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
super.onKeyDown(keyCode, event);
return true;
}
return super.onKeyDown(keyCode, event);
}
//当按键弹起通知长按结束
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:

removeCallbacks(mRepeater); //取消重复listener捕获
if (mStartTime != 0) {
doRepeat(true); //如果长按事件累计时间不为0则说明长按了
mStartTime = 0; //重置长按计时器
}
}
return super.onKeyUp(keyCode, event);
}

private Runnable mRepeater = new Runnable() { //在线程中判断重复
public void run() {
doRepeat(false);
if (isPressed()) {
postDelayed(this, mInterval); //计算长按后延迟下一次累加
}
}
};
private void doRepeat(boolean last) {
long now = SystemClock.elapsedRealtime();
if (mListener != null) {
mListener.onRepeat(this, now - mStartTime, last ? -1 : mRepeatCount++);
}
}

下面是重复Button Listener接口的定义,调用时在Button中先使用setRepeatListener()方法实现RepeatListener接口
public interface RepeatListener {
void onRepeat(View v, long ration, int repeatcount); //参数一为用户传入的Button对象,参数二为延迟的毫秒数,第三位重复次数回调。
}
}

本类大家可以直接在自己的View中implements实现RepeatListener接口即可.

⑶ android 长按事件 和 长按弹出上下文菜单如何处理

android 底层在当你点击控件2秒后就属于长按事件了,则进入长按事件监听,当点击少于2秒就直接进入点击事件了,望有帮助

⑷ android中利用View中的onTouchEvent捕捉长按事件

在自定义定view中想要实现的效果是知睁祥:当手机按住屏幕时,如果在指定的时间内没有移动(如1秒),那么进入长按模式,此时手指在屏幕上移动都算作长按模式。如果手机按住屏幕就立马移动,那么就算作移动模式。

MotionEvent提供了当前的操作类型,按下(搭搏ACTION_DOWN)、 移动 (ACTION_MOVE)、弹起 (ACTION_UP)。MotionEvent 类同时提供了记录当前坐标的函早唯数(getX(),getY())。event.getDownTime()用来记录event发生时的时间,event.getEventTime()用来记录最近一个ACTION_MOVE发生时的时间。

大概思路如下:在按下时记录x,y坐标以及按下时间,当第一次移动的时候获取移动的时间,如果大于指定的长按时间,那么进入长按模式,否则就是普通的移动模式。很容易在模拟器里面实现了这个效果,但是当在真机里面运行时,却无法实现这样的效果。原来模拟器点击的时候能够保证在不移动鼠标的情况下不触发ACTION_MOVE,但是真机却很敏感,几乎在ACTION_DOWN后的几毫秒之后就立马不停的ACTION_MOVE了。想了一下,其实只要稍微变通下变可以在真机上也实现相同的效果了。那就是判断ACTION_MOVE后的坐标和ACTION_DOWN的坐标的偏移值是否小于我们指定的偏移像素,如果在指定值内,那么认为没有移动。

⑸ Android系统判断长按和点击

首先,支持长按和点击的视图一定是从Down开始就消费事件,在不设置Touch监听器OnTouchListener的情况下,每个事件缺旅慧都会进入onTouchEvent方法。

当一个视图设置了长按监听器,在Flag中会增加LONG_CLICKABLE标志。View内部静态类ListenerInfo集合了与View相关的各类监听。

Down事件时,会调用一个checkForLongClick方法,向主线程延迟发送一个Runnable。

延迟时间即系统认为多久算长按事件的时间,如果期间手指一直在触屏,当到达该时间时伏答,主线程调度该任务,run方法,将触发performLongClick方法,系统认为这是一次长按事件。

手指还在触摸时,就会调用长按监听器的onLongClick方法,如果未达到时间,手指已经离开屏幕,Up事件,此时,如果还没有执行过Runnable,将会调用removeCallbacks方法移除该任务,确镇拍保手指离开后不会再触发长按Runnable,同时,执行performClick方法,系统认为这是一次点击事件。

任重而道远

⑹ 移动端android,长按事件时,touchend事件不触发的解决方法

下面记录一个在工作中,遇到的touchend事件不触发的bug解决方法:

就是当长按特定按钮的时候,会启动一个事件,往杯子里面装水,当松开后,会有相关的操作,但是发现在部分安卓手机里面,长按松手后,touchend事件触发不了。一开始在网上找了好多回复,都说在touchstart事件里面加上茄肆e.preventDefault()就可以啦,但是经过亲身试验后,发现此方法对长按事件无效!
后来只能查看了一下touch其他的事件,发现还有 touchcancel 这么一颂缓个东西!
这个事件是颤樱轿在,当触控点被特定的实现方式打乱时触发 的,于是就怀着死马当活马医的心情,在页面添加了touchcancel事件,里面执行的逻辑和touchend事件里面的逻辑是一模一样的,结果还真是不让人失望,完美解决!

阅读全文

与android按住事件相关的资料

热点内容
遵义联通服务器地址是什么 浏览:29
ansys约束命令流 浏览:814
解压软件电脑版如何下载 浏览:791
闪电匕首算法球 浏览:692
linuxredis停止命令 浏览:670
大麦账号怎么加密 浏览:113
穿越火线怎么找服务器 浏览:526
秘密加密社交软件app 浏览:256
c语言编译器怎么找文件 浏览:835
数学不好能编程吗 浏览:254
微云里的视频加密 浏览:41
3大加密货币交易平台 浏览:647
钣金激光切割机编程 浏览:496
vivo手机手电筒app在哪里 浏览:787
单片机晶振电路电容 浏览:887
穿越火线河南一区服务器云主机 浏览:41
文件夹与快捷方式显示一致 浏览:879
幻影服务器怎么看金钱 浏览:349
小米手机怎么用app减肥 浏览:893
本机如何与云服务器互通 浏览:652