目录
一、实现思路
首先我们想要完成的功能是点击屏幕的任意地点,屏幕上会显示一个点击效果,我的实现思路就是监控屏幕的点击事件,当用户点击屏幕的时候显示一个image View到点击地点,过一段时间后再隐藏该image view,至于为什么使用imageview,是因为如果你想实现的点击效果是水波纹的话,绘画水波纹使用的控件就是image view
二、具体步骤
1、创建控件
首先是在xml布局添加一个ImageView,下图中使用的是material组件库中的一种ImageView控件,如果没有导入material的话,使用原生的就行,不过要为它添加圆角
<com.google.android.material.imageview.ShapeableImageView
android:visibility="gone"
android:id="@+id/host"
android:layout_width="30dp"
android:layout_height="30dp"
app:shapeAppearance="@style/CircleStyle"
android:background="@color/black"/>
显示Image view为圆形(使用原生控件的,自行搜索),在values文件夹中的Style.xml中添加如下代码
<style name="CircleStyle">
<item name="cornerFamily">rounded</item>
<item name="cornerSize">50%</item>
</style>
2、在Java文件中实现功能
将下面的代码拷到Java文件中就行,功能实现看下面
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
//获取点击的位置
val centerX = event.rawX.toInt()
val centerY = event.rawY.toInt()
//RelativeLayout是Image控件的父控件类型,自己的看情况修改
//修改控件位置
val lp = RelativeLayout.LayoutParams(host.getLayoutParams())
lp.setMargins(centerX-15, centerY-15, 0, 0)
//参数表示离左上右下的距离,减15是因为我的imageview的宽高是30,为了显示到中心点
host.setLayoutParams(lp)
//将Image view变为可见
host.setVisibility(View.VISIBLE)
//你如果想要的点击事件是水波纹的话在这里绘制水波纹并添加到image view中就行,这里·
不再演示
//创建延时任务
val task: TimerTask = object : TimerTask() {
override fun run() {
// 要执行的操作
val msg = Message()
msg.what = 1
handler.sendMessage(msg)
}
}
val timer = Timer()
timer.schedule(task, 100) // 延时0.1s 执行TimeTask的run方法
}
}
return super.dispatchTouchEvent(event)
}
private val handler: Handler = object : Handler(Looper.myLooper()!!) {
override fun handleMessage(msg: Message) {
when (msg.what) {
1 -> host.setVisibility(View.GONE)//将Imageview变为不可见
}
}
}
3、解读代码
dispatchTouchEvent()方法是安卓触摸屏事件的一个入口方法, 你也可以通过下面这篇文章去查找适合自己的响应方法,直接将case中的代码拷进你找到的方法里面就行(8条消息) Android 中屏幕点击事件的实现_最是那一低头的温柔的博客-CSDN博客
其余的看注释就行,够详细了