Android(Kotlin)点击屏幕任意地点显示点击效果的实现方式

目录

一、实现思路

二、具体步骤

1、创建控件

2、在Java文件中实现功能

3、解读代码


一、实现思路

首先我们想要完成的功能是点击屏幕的任意地点,屏幕上会显示一个点击效果,我的实现思路就是监控屏幕的点击事件,当用户点击屏幕的时候显示一个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博客

其余的看注释就行,够详细了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小趴菜8227

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值