三次点击事件的原理图:数组的复制(android源码的调用):

下面就是第一步:

创建long数组,里面的数字代表点击的次数。
下面是主要代码实现:

system.arraycopy();里面的参数描述:

 
最后就是在if里面实现你想要的按钮的点击逻辑,不过最后一点很重要,当按钮还有触摸的点击事件的时候,有一点:

一定记得返回false;
下面贴出我的源码:tv_drag实现双击居中方法(里面有触摸事件):
 
 
package com.example.mobilesafe74.activity;
 
import com.example.mobilesafe74.R;
import com.example.mobilesafe74.utils.ConstantValue;
import com.example.mobilesafe74.utils.SpUtil;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
 
public class ToastLocationActivity extends Activity {
 private ImageView tv_drag;
 private Button bt_top;
 private Button bt_bottom;
 private WindowManager mWm;
 private int mScreenwidth;
 private int mScreenheight;
 private long[] mhits = new long[2];
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_toast_location);
  initUI();
 }
 
 private void initUI() {
  // 当前可以拖拽的图片控件
  tv_drag = (ImageView) findViewById(R.id.tv_drag);
  bt_top = (Button) findViewById(R.id.bt_top);
  bt_bottom = (Button) findViewById(R.id.bt_bottom);
  mWm = (WindowManager) getSystemService(WINDOW_SERVICE);
  mScreenwidth = mWm.getDefaultDisplay().getWidth();
  mScreenheight = mWm.getDefaultDisplay().getHeight();
 
  int locationX = SpUtil.getInt(getApplicationContext(),
    ConstantValue.LOCATION_X, 0);
  int locationY = SpUtil.getInt(getApplicationContext(),
    ConstantValue.LOCATION_Y, 0);
 
  // 左上坐标作用在控件上面
  // 指定宽高都是w w
  LayoutParams LayoutParams = new RelativeLayout.LayoutParams(
    RelativeLayout.LayoutParams.WRAP_CONTENT,
    RelativeLayout.LayoutParams.WRAP_CONTENT);
  LayoutParams.leftMargin = locationX;
  LayoutParams.topMargin = locationY;
  if (LayoutParams.topMargin > mScreenheight / 2) {
   bt_bottom.setVisibility(View.INVISIBLE);
   bt_top.setVisibility(View.VISIBLE);
 
  } else {
   bt_bottom.setVisibility(View.VISIBLE);
   bt_top.setVisibility(View.INVISIBLE);
 
  }
  // 将以上规则作用在控件上面
  tv_drag.setLayoutParams(LayoutParams);
  tv_drag.setOnClickListener(new OnClickListener() {
 
   @Override
   public void onClick(View arg0) {
    System.arraycopy(mhits, 1, mhits, 0, mhits.length - 1);
    mhits[mhits.length - 1] = SystemClock.uptimeMillis();
    if (mhits[mhits.length - 1] - mhits[0] < 500) {
     // 满足双击事件后,居中
     int left = mScreenwidth / 2 - tv_drag.getWidth() / 2;
     int right = mScreenheight / 2 - tv_drag.getHeight() / 2;
     int top = mScreenwidth / 2 + tv_drag.getWidth() / 2;
     int bottom = mScreenheight / 2 + tv_drag.getHeight() / 2;
 
     // 显示出来
     tv_drag.layout(left, top, right, bottom);
 
    }
 
   }
  });
 
  // 可以拖拽的点击事件
  tv_drag.setOnTouchListener(new OnTouchListener() {
 
   private int startX;
   private int startY;
 
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:// 按下
     // 初始位置的坐标
     startX = (int) event.getRawX();
     startY = (int) event.getRawY();
 
     break;
    case MotionEvent.ACTION_MOVE:// 移动
     int moveX = (int) event.getRawX();
     int moveY = (int) event.getRawY();
 
     int disX = moveX - startX;
     int disY = moveY - startY;
 
     // 当前控件的上下左右的坐标
     int left = tv_drag.getLeft() + disX;
     int top = tv_drag.getTop() + disY;
     int right = tv_drag.getRight() + disX;
     int bottom = tv_drag.getBottom() + disY;
     // 容错处理
     if (left < 0) {
      return true;
     }
 
     if (right > mScreenwidth) {
      return true;
     }
 
     if (top < 0) {
      return true;
     }
 
     if (bottom > mScreenheight - 22) {
      return true;
     }
     if (top > mScreenheight / 2) {
      bt_bottom.setVisibility(View.INVISIBLE);
      bt_top.setVisibility(View.VISIBLE);
 
     } else {
      bt_bottom.setVisibility(View.VISIBLE);
      bt_top.setVisibility(View.INVISIBLE);
 
     }
 
     // 告知控件,按计算的坐标去展示
 
     tv_drag.layout(left, top, right, bottom);
     // 重置坐标
     startX = (int) event.getRawX();
     startY = (int) event.getRawY();
 
     break;
    case MotionEvent.ACTION_UP:// 抬起
     // 记录位置坐标
     SpUtil.putInt(getApplicationContext(),
       ConstantValue.LOCATION_X, tv_drag.getLeft());
     SpUtil.putInt(getApplicationContext(),
       ConstantValue.LOCATION_Y, tv_drag.getTop());
 
     break;
    }
    // 返回事件,只有触摸操作的时候用true,有点击事件记得加上return false
    return false;
   }
  });
 }
}
 
 

android的多次点击事件的实现(有源码)的更多相关文章

  1. Android Button四种点击事件和长按事件

    项目XML代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...

  2. 查找和定位Android应用的按钮点击事件的代码位置基于Xposed Hook实现

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80956455 在进行Android程序的逆向分析的时候,经常需要通过Androi ...

  3. Android学习---ListView的点击事件,simpleAdapter和arrayadapter,SimpleCursoAdapter的原理和使用

    如题,本文将介绍 listview的点击事件,simpleAdapter和arrayadapter的原理和使用. 1.ListView的注册点击事件 //注册点击事件 personListView.s ...

  4. android 入门 003 (点击事件)

    点击事件 有四种实现方式. 1.内部类实现方式 1.0 package cn.rfvip.clickevent; import android.app.Activity; import android ...

  5. Android 给TextView添加点击事件

    首先设定TextView的clickable属性为true. 可以在布局文件中进行设定,比如: <TextView android:id="@+id/phone" andro ...

  6. Android ListView中Item点击事件失效解决方案

    欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布 ...

  7. Android 自定义View——自定义点击事件

    每个人手机上都有通讯录,这是毫无疑问的,我们通讯录上有一个控件,在通讯录的最左边有一列从”#”到”Z”的字母,我们通过滑动或点击指定的字母来确定联系人的位置,进而找到联系人.我们这一节就通过开发这个控 ...

  8. Android 7.0 TextView点击事件无效修复方案

    public class PostTextView extends TextView { private Handler handler = new Handler(Looper.getMainLoo ...

  9. 关于Android避免按钮重复点击事件

    最近测试人员测试我们的APP的时候,喜欢快速点击某个按钮,出现一个页面出现多次,测试人员能不能禁止这样.我自己点击了几下,确实存在这个问题,也感觉用户体验不太好.于是乎后来我搜了下加一个方法放在我们U ...

随机推荐

  1. IOS开发---菜鸟学习之路--(十一)-使新闻内容自适应高度

    上一章当中,我们留了一个小BUG. 其实就是浏览新闻的时候,如果文字内容过长的花,UITextView 会有个下拉框,而最底层的UIScrollView也有个下拉框,那么在使用的时候就会非常的不爽. ...

  2. python 学习分享-装饰器篇

    本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...

  3. 设计模式之迭代器模式 Iterator

    代码实现 public interface MyIterator { void first(); //将游标指向第一个元素 void next(); //将游标指向下一个元素 boolean hasN ...

  4. [DM8168]Linux下控制GPIO实现LED流水灯

    首先加载驱动模块,应用程序通过调用API实现GPIO控制功能. 驱动程序: /* * fileName: led_gpio.c * just for LED GPIO test * GP1_14 -& ...

  5. application.properties 详解

    mvc spring.mvc.async.request-timeout设定async请求的超时时间,以毫秒为单位,如果没有设置的话,以具体实现的超时时间为准,比如tomcat的servlet3的话是 ...

  6. Canvas与Image互相转换示例以及利用该技术实现微信长按自动识别二维码功能

    现在扫描二维码已经很普遍,微信扫一扫即可,但是如果二维码是在自己的手机上呢?那就要用到微信里的一个功能了,手指长按二维码,会弹出自动识别的选项,点确定就可以看到二维码的内容了.那么怎么通过前端实现这个 ...

  7. 浅谈后缀自动机SAM

    一下是蒟蒻的个人想法,并不很严谨,仅供参考,如有缺误,敬请提出 参考资料: 陈立杰原版课件 litble 某大神 某大神 其实课件讲得最详实了 有限状态自动机 我们要学后缀自动机,我们先来了解一下自动 ...

  8. leetcode 21 list merge

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  9. css 两列布局中单列定宽单列自适应布局的6种思路

    前面的话 说起自适应布局方式,单列定宽单列自适应布局是最基本的布局形式.本文将从float.inline-block.table.absolute.flex和grid这六种思路来详细说明如何巧妙地实现 ...

  10. iOS - 毛玻璃效果封装

    #import <UIKit/UIKit.h> #import <Accelerate/Accelerate.h> @interface UIImage (TY_ImageEd ...