Android入门之onTouchEvent触碰事件的示例详解
作者:TGITCIC 发布时间:2021-08-31 14:27:58
简介
平时包括之前的例子大量是基于TouchListener如:onClick这种一类的事件。
今天给大家带来的是TouchListener与OnTouchEvent的比较,以及多点触碰的知识点! TouchListener是基于监听的,而OnTouchEvent则是基于回调的!
因此我们通过一个小例子,来擅述同样是触碰事件的ouTouchEvent是什么样的。
onTouchEvent应用场景
onTouchEvent更多的是用于自定义的view,所有的view类中都重写了该方法,而这种触摸事件是基于回调的,也就是说:如果我们返回的值是false的话,那么事件会继续向外传播,由外面的容器或者Activity进行处理!当然还涉及到了手势(Gesture),这个我们会在后面进行详细的讲解!onTouchEvent其实和onTouchListener是类似的,只是处理机制不用,前者是回调,后者是监听模式!
样例说明
代码示例: 定义一个简单的view,绘制一个蓝色的小圆,可以跟随手指进行移动
实现代码: CircleView.java。
全代码
前端
CircleView.java
对,你没看错!
这个不是.xml文件。它长下面这个样
package org.mk.android.demo;
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 CircleView extends View {
public float X = 50;
public float Y = 50;
//创建画笔
Paint paint = new Paint();
public CircleView(Context context, AttributeSet set)
{
super(context,set);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setColor(Color.RED);
canvas.drawCircle(X,Y,50,paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
this.X = event.getX();
this.Y = event.getY();
//通知组件进行重绘
this.invalidate();
return true;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<org.mk.android.demo.CircleView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
我们把这个java在activity_main.xml文件中如上这样引用。此时设计器已经显示出来效果了。
后端
package org.mk.android.demo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
哈哈哈,是一个光板。
因为所有的逻辑、触碰事件都已经在CircleView.java里实现了。
运行起来后,你的界面上就会有一个小红圆圈,请你用鼠标拖着这个小红圆圈不要放到处拖,这个小红圆圈也会跟随着你的鼠标到处乱跑。
自己请动一下手试试看吧。
后续
对于单指、双指缩放等手势,其实也很简单,就是我们的onTouchEvent(MotionEvent event)里的这个MotionEvent,它还有额外几个事件
MotionEvent.ACTION_POINTER_DOWN:当屏幕上已经有一个点被按住,此时再按下其他点时触发。
MotionEvent.ACTION_POINTER_UP:当屏幕上有多个点被按住,松开其中一个点时触发(即非最后一个点被放开时)。
因此我留下一个回家作业,即:在Android上实现以下这两个功能让大家去自己试试
单指点击一个图片拖动;
双指对着一个图片进行“缩放”,便得相应的图片的大小也跟着你的双指的缩放作“伸缩”;
真心很简单,提示:提供以下原理性代码供你去实现这个小作业。
switch (event.getAction() & MotionEvent.ACTION_MASK) {
// 单指
case MotionEvent.ACTION_DOWN:
break;
// 双指
case MotionEvent.ACTION_POINTER_DOWN:
来源:https://blog.csdn.net/lifetragedy/article/details/128174066
猜你喜欢
- StringRedisTemplate与RedisTemplate区别点两者的关系是StringRedisTemplate继承RedisTe
- RunnableRunnable接口非常简单,就定义了一个方法run(), 实现Runnable接口的run方法就可以实现多线程// 函数式
- 1. 程序计数器(线程私有)程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器(切换线程后,能恢复到正确的执行位
- springboot项目启动,访问报404错误今天在做一个springboot项目的时候,是接着别人的项目写的,写完之后想做一下测试,于是就
- 一、JDK * Java 在 java.lang.reflect 包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只
- 概念Drawable表示一种可以在Canvas上进行绘制的抽象的概念,它有很多种,常见的如颜色和图片都可以是一个Drawable。优点首先,
- 安卓使用SmsManager实现发送短信,供大家参考,具体内容如下关键代码实现package com.example.sms; import
- 扫雷游戏,大家都应该玩过吧!其实规则也很简单,可是我们想自己实现一个扫雷,我们应该怎么做呢?Step1: 知晓游戏原理扫雷就是要把所有非地雷
- 平均背景法的基本思想是计算每个像素的平均值和标准差作为它的背景模型。平均背景法使用四个OpenCV函数:cvAcc(),累积图像;cvAbs
- 从Microsoft .Net 2.0版本以后,就默认提供了System.IO.Ports.SerialPort类,用户可以非常简单地编写少
- Service层:public int addUser(UserDomian user){ int i = userMapper
- 如:string str1 = "This is a test";string str2 = "This-is
- state:比较常用,各种状态都可以用它,但是它更着重于一种心理状态或者物理状态。Status:用在人的身上一般是其身份和地位,作“状态,情
- 在使用feign调用其它服务时,发现获取的参数是null,当参数是对象是,是执行的Post请求,所以要在方法参数前加@RequestBody
- 模板的定义C++中的模板和泛型编程是非常重要的概念。模板是一种将数据类型作为参数的通用程序设计方法。它们允许开发人员编写可以处理各种数据类型
- 序言:使用MyBatis3提供的注解可以逐步取代XML,例如使用@Select注解直接编写SQL完成数据查询,使用@SelectProvid
- 在前面一篇Java Comparable和Comparator对比详解中,对于java中的排序方法进行比较和具体剖析,主要是针对 Compa
- 【前言】AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统
- 当你在使用Mybatis 时进行配置的时候有这样几个坑一定要注意下。mybatisplus中逻辑删除通俗说为了在数据库中保留数据,但是又不想
- 本文实例为大家分享了Java实现医院管理系统的具体代码,供大家参考,具体内容如下1.开发工具NetBeans8.2Mysql5.7mysql