干货---不了解这些多线程的基础知识,很难学懂Android!


接口1:OnGestureListener

1. 作用

检测用户在屏幕的以下操作:按下瞬间、按压、长按、轻击、快速滑屏、拖动

2. 使用步骤

// 步骤1:创建手势检测器实例 & 传入OnGestureListener接口(需要复写对应方法)
// 构造函数有3个,常用的是第二个
// 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
// 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
// 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {

// 1. 用户轻触触摸屏
public boolean onDown(MotionEvent e) {
Log.i(“MyGesture”, “onDown”);
return false;
}

// 2. 用户轻触触摸屏,尚未松开或拖动
// 与onDown()的区别:无松开 / 拖动
// 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行
public void onShowPress(MotionEvent e) {
Log.i(“MyGesture”, “onShowPress”);
}

// 3. 用户长按触摸屏
public void onLongPress(MotionEvent e) {
Log.i(“MyGesture”, “onLongPress”);
}

// 4. 用户轻击屏幕后抬起
public boolean onSingleTapUp(MotionEvent e) {
Log.i(“MyGesture”, “onSingleTapUp”);
return true;
}

// 5. 用户按下触摸屏 & 拖动
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i(“MyGesture”, “onScroll:”);
return true;
}

// 6. 用户按下触摸屏、快速移动后松开
// 参数:
// e1:第1个ACTION_DOWN MotionEvent
// e2:最后一个ACTION_MOVE MotionEvent
// velocityX:X轴上的移动速度,像素/秒
// velocityY:Y轴上的移动速度,像素/秒
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i(“MyGesture”, “onFling”);
return true;
}

});

// 步骤2-1:让某个View检测手势 - 重写View的onTouch函数,将View的触屏事件交给GestureDetector处理,从而对用户手势作出响应
View.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true; // 注:返回true才能完整接收触摸事件
}
});

// 步骤2-2:让某个Activity检测手势:重写Activity的dispatchTouchEvent函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mGestureDetector.onTouchEvent(ev); // 让GestureDetector响应触碰事件
super.dispatchTouchEvent(ev); // 让Activity响应触碰事件
return false;
}

3. 实例说明

现在对一个TextView进行手势检测
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:orientation=“vertical”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
tools:context=“.MainActivity”

MainActivity.java

public class MainActivity extends AppCompatActivity {

TextView mTextView;
GestureDetector mGestureDetector;

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

// 步骤1:创建手势检测器实例 & 传入OnGestureListener接口(需要复写对应方法)
mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {

// 1. 用户轻触触摸屏
public boolean onDown(MotionEvent e) {
Log.i(“MyGesture”, “onDown”);
return false;
}

// 2. 用户轻触触摸屏,尚未松开或拖动
// 与onDown()的区别:无松开 / 拖动
// 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行
public void onShowPress(MotionEvent e) {
Log.i(“MyGesture”, “onShowPress”);
}

// 3. 用户长按触摸屏
public void onLongPress(MotionEvent e) {
Log.i(“MyGesture”, “onLongPress”);
}

// 4. 用户轻击屏幕后抬起
public boolean onSingleTapUp(MotionEvent e) {
Log.i(“MyGesture”, “onSingleTapUp”);
return true;
}

// 5. 用户按下触摸屏 & 拖动
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i(“MyGesture”, “onScroll:”);
return true;
}

// 6. 用户按下触摸屏、快速移动后松开
// 参数:
// e1:第1个ACTION_DOWN MotionEvent
// e2:最后一个ACTION_MOVE MotionEvent
// velocityX:X轴上的移动速度,像素/秒
// velocityY:Y轴上的移动速度,像素/秒
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i(“MyGesture”, “onFling”);
return true;
}

});

// 步骤2:让TextView检测手势:重写View的onTouch函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应
mTextView = (TextView) findViewById(R.id.textView);
mTextView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return false;
}
});
}
}

4. 示意图

我在屏幕作出一系列手势进行测试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


接口2:OnDoubleTapListener

1. 作用

检测用户单击、双击屏幕

2. 使用步骤

// 步骤1:创建手势检测器实例
// 注:使用OnDoubleTapListener接口时,需要使用GestureDetector,而GestureDetector的创建则必须传入OnGestureListener接口
// 所以在使用OnDoubleTapListener接口时,也必须实现OnGestureListener接口
// 构造函数有3个,常用的是第二个
// 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
// 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
// 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {

// 1. 用户轻触触摸屏
public boolean onDown(MotionEvent e) {
Log.i(“MyGesture”, “onDown”);
return false;
}

// 2. 用户轻触触摸屏,尚未松开或拖动
// 与onDown()的区别:无松开 / 拖动
// 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行
public void onShowPress(MotionEvent e) {
Log.i(“MyGesture”, “onShowPress”);
}

// 3. 用户长按触摸屏
public void onLongPress(MotionEvent e) {
Log.i(“MyGesture”, “onLongPress”);
}

// 4. 用户轻击屏幕后抬起
public boolean onSingleTapUp(MotionEvent e) {
Log.i(“MyGesture”, “onSingleTapUp”);
return true;
}

// 5. 用户按下触摸屏 & 拖动
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i(“MyGesture”, “onScroll:”);
return true;
}

// 6. 用户按下触摸屏、快速移动后松开
// 参数:
// e1:第1个ACTION_DOWN MotionEvent
// e2:最后一个ACTION_MOVE MotionEvent
// velocityX:X轴上的移动速度,像素/秒
// velocityY:Y轴上的移动速度,像素/秒
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i(“MyGesture”, “onFling”);
return true;
}

});

// 步骤2:创建 & 设置OnDoubleTapListener接口实现类
mGestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {

// 1. 单击事件
// 关于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的区别
// onSingleTapConfirmed:再次点击(即双击),则不会执行
// onSingleTapUp:手抬起就会执行
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i(“MyGesture”, “onSingleTapConfirmed”);
return false;
}

// 2. 双击事件
public boolean onDoubleTap(MotionEvent e) {
Log.i(“MyGesture”, “onDoubleTap”);
return false;
}
// 3. 双击间隔中发生的动作
// 指触发onDoubleTap后,在双击之间发生的其它动作,包含down、up和move事件;
public boolean onDoubleTapEvent(MotionEvent e) {
Log.i(“MyGesture”, “onDoubleTapEvent”);
return false;
}
});

// 步骤3-1:让某个View检测手势 - 重写View的onTouch函数,将View的触屏事件交给GestureDetector处理,从而对用户手势作出响应
View.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true; // 注:返回true才能完整接收触摸事件
}
});

// 步骤3-2:让某个Activity检测手势:重写Activity的dispatchTouchEvent函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mGestureDetector.onTouchEvent(ev); // 让GestureDetector响应触碰事件
super.dispatchTouchEvent(ev); // 让Activity响应触碰事件
return false;
}

3. 实例说明

现在对一个TextView进行手势检测
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:orientation=“vertical”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
tools:context=“.MainActivity”

MainActivity.java

public class MainActivity extends AppCompatActivity {

TextView mTextView;
GestureDetector mGestureDetector;

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

// 步骤1:创建手势检测器实例 & 传入OnGestureListener接口(需要复写对应方法)
mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {

// 1. 用户轻触触摸屏
public boolean onDown(MotionEvent e) {
Log.i(“MyGesture1”, “onDown”);
return false;
}

// 2. 用户轻触触摸屏,尚未松开或拖动
// 与onDown()的区别:无松开 / 拖动
// 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行
public void onShowPress(MotionEvent e) {
Log.i(“MyGesture”, “onShowPress”);
}

// 3. 用户长按触摸屏
public void onLongPress(MotionEvent e) {
Log.i(“MyGesture”, “onLongPress”);
}

// 4. 用户轻击屏幕后抬起
public boolean onSingleTapUp(MotionEvent e) {
Log.i(“MyGesture”, “onSingleTapUp”);
return true;
}

// 5. 用户按下触摸屏 & 拖动
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i(“MyGesture”, “onScroll:”);
return true;
}

// 6. 用户按下触摸屏、快速移动后松开
// 参数:
// e1:第1个ACTION_DOWN MotionEvent
// e2:最后一个ACTION_MOVE MotionEvent
// velocityX:X轴上的移动速度,像素/秒
// velocityY:Y轴上的移动速度,像素/秒
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i(“MyGesture”, “onFling”);
return true;
}

});

// 步骤2:创建 & 设置OnDoubleTapListener接口实现类
mGestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {

// 1. 单击事件
// 关于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的区别
// onSingleTapConfirmed:再次点击(即双击),则不会执行
// onSingleTapUp:手抬起就会执行
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i(“MyGesture”, “onSingleTapConfirmed”);
return false;
}

// 2. 双击事件
public boolean onDoubleTap(MotionEvent e) {
Log.i(“MyGesture”, “onDoubleTap”);
return false;
}
// 3. 双击间隔中发生的动作
// 指触发onDoubleTap后,在双击之间发生的其它动作,包含down、up和move事件;
public boolean onDoubleTapEvent(MotionEvent e) {
Log.i(“MyGesture”, “onDoubleTapEvent”);
return false;
}
});

// 步骤3:重写View的onTouch函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应
mTextView = (TextView) findViewById(R.id.textView);

mTextView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true;
}
});
}
}

4. 测试效果

日志效果如下

[图片上传失败…(image-1c663d-1595234367877)]


使用类:SimpleOnGestureListener

1. 作用

集成了两个接口的手势检测功能

2. 与上述两个接口的区别

  • OnGestureListener和OnDoubleTapListener接口里的函数都是强制必须重写的
  • 而SimpleOnGestureListener类的函数则可根据需要选择性复写,因为SimpleOnGestureListener类本身已经实现了这两个接口的所有函数,只是里面全是空的而已

3. 使用步骤

// 步骤1:创建手势检测器实例
// 构造函数有3个,此处用的是第三个
// 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
// 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
// 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {

// OnGestureListener接口的函数
// 1. 用户轻触触摸屏
public boolean onDown(MotionEvent e) {
Log.i(“MyGesture1”, “onDown”);
return false;
}

// 2. 用户轻触触摸屏,尚未松开或拖动
// 与onDown()的区别:无松开 / 拖动
// 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行
public void onShowPress(MotionEvent e) {
Log.i(“MyGesture”, “onShowPress”);
}

// 3. 用户长按触摸屏
public void onLongPress(MotionEvent e) {
Log.i(“MyGesture”, “onLongPress”);
}

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-V1m84v1A-1715902296200)]

[外链图片转存中…(img-yih3ukB0-1715902296201)]

[外链图片转存中…(img-s04fn3UM-1715902296202)]

[外链图片转存中…(img-kXF9bw7C-1715902296203)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值