一、目标
实现自定义的Toast显示框在来电显示时双击便可自动居中
二、代码实现
1、在“显示地址”服务(ShowPhoneAddService)中定义一个long类型的数组成员变量(取名mHits),用于存储双击事件的时间间隔;
long类型的数组成员变量(mHits):
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 private long[] mHits = new long[2];
2、通过View对象(view)的setOnClickListener(OnClickListener l)方法为其设置点击事件,参数OnClickListener l通过new实例化OnClickListener()接口对象,并实现其onClick(View v)方法,导包。在onClick(View v)方法中:
(1)通过系统(System)的arraycopy(Object src, int srcPos, Object dst, int dstPos, int length)方法将数组(mHits)移位拷贝一次,参数src为被拷贝的资源,srcPos表示被拷贝资源的起始位置,dst表示粘贴到的目标资源,dstPos表示粘贴至目标资源的位置,length表示拷贝长度;
(2)用于存储点击时间的数组最后一个数据通过系统时间对象SystemClock的uptimeMillis()方法获取当前时间至开始时间的毫秒值;
(3)通过if语句判断当前开始时间(SystemClock.uptimeMillis())与数据第一个时间的差值是否小于500毫秒,如成立则在if语句中执行:
①将窗口对象(params)的x轴、Y轴坐标值分别设为屏幕宽度与Toast窗口宽度的一半的差值;
②通过窗口管理对象(wm)的updateViewLayout(View view, LayoutParams params)方法更新显示对象;
③通过SharedPreferences对象(sp)保存。
点击事件代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 view.setOnClickListener(new OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 System.arraycopy(mHits, 1, mHits, 0, mHits.length-1); 6 mHits[mHits.length-1] = SystemClock.uptimeMillis(); 7 if(SystemClock.uptimeMillis()-mHits[0]<=500){//双击时间间隔少于500毫秒 8 //Toast窗口居中显示,即屏幕宽度一半减去Toast窗口宽度一半 9 params.x = wm.getDefaultDisplay().getWidth()/2-view.getWidth()/2; 10 params.y = wm.getDefaultDisplay().getHeight()/2-view.getHeight()/2; 11 wm.updateViewLayout(view, params);//更新显示 12 Editor editor = sp.edit(); 13 editor.putInt("ToastX", params.x); 14 editor.putInt("ToastY", params.y); 15 editor.commit(); 16 } 17 } 18 });