对前面的自定义的toast制作拖拽效果,以及双击居中效果

注意:

/*toast窗体类型默认不响应窗体点击事件

params.type = WindowManager.LayoutParams.TYPE_TOAST;*/
/*制定具有电话优先级的窗体类型,需要添加权限 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>*/

params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;

代码如下:

package com.zaizai.safty.service;

import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.SharedPreferences;import android.graphics.PixelFormat;import android.os.IBinder;import android.os.SystemClock;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.util.Log;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;import android.widget.TextView;

import com.zaizai.safty.R;import com.zaizai.safty.db.dao.NumberAddressQueryUtils;

public class AddressService extends Service {

    private static final String TAG = "zaizai";    //窗体管理者    private WindowManager windowManager;    private View view;

    /**     * 电话     */

    private TelephonyManager telephonyManager;    private MyListenerPhone myListenerPhone;

    private OutCallReceiver outCallReceiver;    private WindowManager.LayoutParams params;    private SharedPreferences sharedPreferences;

    @Override    public IBinder onBind(Intent intent) {        // TODO Auto-generated method stub        return null;    }

    // 服务里面的内部类    //广播接收者的生命周期和服务一样

    class OutCallReceiver extends BroadcastReceiver {

        @Override        public void onReceive(Context context, Intent intent) {            // 这就是我们拿到的播出去的电话号码            String phone = getResultData();            // 查询数据库            String address = NumberAddressQueryUtils.queryNumber(phone);

            // Toast.makeText(context, address, Toast.LENGTH_LONG).show();            myToast(address);        }

    }

    private class MyListenerPhone extends PhoneStateListener {

        @Override        public void onCallStateChanged(int state, String incomingNumber) {            // state:状态,incomingNumber:来电号码            super.onCallStateChanged(state, incomingNumber);            switch (state) {                case TelephonyManager.CALL_STATE_RINGING:// 来电铃声响起                    // 查询数据库的操作                    String address = NumberAddressQueryUtils                            .queryNumber(incomingNumber);                    //Toast.makeText(getApplicationContext(), address, Toast.LENGTH_LONG).show();                    myToast(address);                    break;

                case TelephonyManager.CALL_STATE_IDLE://电话的空闲状态:挂电话、来电拒绝                    //把这个View移除                    if (view != null) {                        windowManager.removeView(view);                    }                    break;

                default:                    break;            }        }

    }

    @Override    public void onCreate() {        // TODO Auto-generated method stub        super.onCreate();        //电话服务        telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

        // 监听来电        myListenerPhone = new MyListenerPhone();        //注册服务去监听电话        telephonyManager.listen(myListenerPhone, PhoneStateListener.LISTEN_CALL_STATE);

        //用代码去注册广播接收者Begin        outCallReceiver = new OutCallReceiver();        IntentFilter filter = new IntentFilter();        filter.addAction("android.intent.action.NEW_OUTGOING_CALL");        registerReceiver(outCallReceiver, filter);        //用代码去注册广播接收者End        //实例化窗体        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);    }

    /**     * 自定义土司     *     * @param address     */

    private long[] mHits = new long[2];

    public void myToast(String address) {        /*绘制UI界面*/        view = View.inflate(this, R.layout.address_show, null);        TextView textview = (TextView) view.findViewById(R.id.tv_address);        view.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {

                /*双击两次居中*/                System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);                mHits[mHits.length - 1] = SystemClock.uptimeMillis();

                if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {                    /*成功双击两次*/                    Log.i(TAG, "双击成功:");                    params.x = windowManager.getDefaultDisplay().getWidth() / 2 - view.getWidth() / 2;                    params.y = windowManager.getDefaultDisplay().getHeight() / 2 - view.getHeight() / 2;                    windowManager.updateViewLayout(view, params);                    SharedPreferences.Editor editor = sharedPreferences.edit();                    editor.putInt("lastx", params.x);                    editor.putInt("lasty", params.y);                    editor.commit();

                }            }        });

        view.setOnTouchListener(new View.OnTouchListener() {            int startX;            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();                        Log.i(TAG, "开始位置:" + startX + "," + startY);                        break;                    }                    case MotionEvent.ACTION_MOVE://手指在屏幕上移动                    {                        int newX = (int) event.getRawX();                        int newY = (int) event.getRawY();                        Log.i(TAG, "移动后位置:" + newX + "," + newY);                        int dx = newX - startX;                        int dy = newY - startY;                        Log.i(TAG, "移动后的偏移量:" + dx + "," + dy);                        Log.i(TAG, "更新ImageView在窗体的偏移量:" + dx + "," + dy);                        /*重新设置窗体的开始位置,结束位置*/                        params.x += dx;                        params.y += dy;                        if (params.x < 0) {                            params.x = 0;                        } else if (params.y < 0) {                            params.y = 0;                        } else if (params.x > (windowManager.getDefaultDisplay().getWidth() - view.getWidth())) {                            params.x = windowManager.getDefaultDisplay().getWidth() - view.getWidth();                        } else if (params.y > (windowManager.getDefaultDisplay().getHeight() - view.getHeight())) {                            params.y = windowManager.getDefaultDisplay().getHeight() - view.getHeight();                        }                        windowManager.updateViewLayout(view, params);                        // 重新初始化手指的开始结束位置。                        startX = (int) event.getRawX();                        startY = (int) event.getRawY();                        break;                    }                    case MotionEvent.ACTION_UP://手指离开屏幕                    {                        //记录控件距离屏幕左上角的坐标                        SharedPreferences.Editor editor = sharedPreferences.edit();                        editor.putInt("lastx", params.x);                        editor.putInt("lasty", params.y);                        editor.commit();                        break;                    }

                }                return false;//事件处理完毕,返回ture,将事件拦截掉,不让负空间布局响应触摸事件            }        });

        //"半透明","活力橙","卫士蓝","金属灰","苹果绿"        int[] ids = {R.mipmap.call_locate_white9, R.mipmap.call_locate_orange9, R.mipmap.call_locate_blue9                , R.mipmap.call_locate_gray9, R.mipmap.call_locate_green9};

        /*获得用户设置的风格,默认为0半透明*/        sharedPreferences = getSharedPreferences("config", MODE_PRIVATE);

        view.setBackgroundResource(ids[sharedPreferences.getInt("which", 0)]);        textview.setText(address);        //窗体的参数就设置好了        params = new WindowManager.LayoutParams();

        params.height = WindowManager.LayoutParams.WRAP_CONTENT;        params.width = WindowManager.LayoutParams.WRAP_CONTENT;

        /*吐司位置设置   params.gravity = Gravity.TOP; 多个参数使用+号连接*/        params.gravity = Gravity.TOP + Gravity.LEFT;        /*左边100 顶部100 */        params.x = sharedPreferences.getInt("lastx", 0);        params.y = sharedPreferences.getInt("lasty", 0);

        params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE              /*  | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE              * 去掉响应时间*/                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;        params.format = PixelFormat.TRANSLUCENT;        /*toast窗体类型默认不响应窗体点击事件  params.type = WindowManager.LayoutParams.TYPE_TOAST;*/        /*制定具有电话优先级的窗体类型,需要添加权限 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>*/        params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;        windowManager.addView(view, params);

    }

    @Override    public void onDestroy() {        // TODO Auto-generated method stub        super.onDestroy();        // 取消监听来电        telephonyManager.listen(myListenerPhone, PhoneStateListener.LISTEN_NONE);        myListenerPhone = null;

        //用代码取消注册广播接收者        unregisterReceiver(outCallReceiver);        outCallReceiver = null;

    }

}
时间: 2024-10-25 06:08:44

对前面的自定义的toast制作拖拽效果,以及双击居中效果的相关文章

jQuery拖拽插件制作拖拽排序特效

基于jQuery拖拽插件制作拖拽排序特效是一款非常实用的鼠标拖拽布局插件.效果图如下: 在线预览   源码下载 实现的代码. html代码: <h1>水平拖拽</h1> <div class="demo"> <div class="item item1"><span>1</span></div> <div class="item item2"><

两个GridView之间数据转移,交互,实现拖拽,网易新闻列表效果实现

两个GridView之间数据转移,交互,实现拖拽,网易新闻列表效果实现 摘要 :android 高仿频道管理网易新闻. 新闻频道增删,排序,以及一些动画的实现 可拖动的GridView 地址  :  http://www.itnose.net/detail/6035345.html

完美拖拽 &amp;&amp;仿腾讯微博效果&amp;&amp; 自定义多级右键菜单

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

自定义导航器中的拖拽定义

有时候需要对导航器中的拖拽对象进行赋值,使用的场景是,拖拽导航器中的某个文件或者类或方法等,到某个编辑器中,,因为默认的导航器所配备的拖拽动作,或则不能满足我们的需要,所有,有必要自定义,,拖拽器,,在哪里定义?就在如下的类方法中. 参考类com.langsotech.studio.navigator.base.views.JCommonViewer中的方法@Overrideprotected void initDragAndDrop() {  /* Handle Drag and Drop *

android项目 之 记事本(14) ----- 手势缩放与拖拽图片

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 上节实现了查看图片及录音的功能,其中查看图片,可以调用系统的图库来查看图片,也可以自定义Activity来查看图片,今天就在上节的基础上,实现手势缩放与拖拽图片. 想必大家都用过系统的图库,浏览图片时,可以通过手势放大或缩小图片,旋转图片,拖拽图片等功能,我们也为自已定义的查看图片的Activity增加手势缩放与拖拽图片的功能,效果如下图: 上面四幅图中,演示了通过手势(多点触

我的开源框架之可拖拽功能实现

需求: (1)实现元素可拖拽 (2)自定义拖拽范围 (3)自定义按下触发拖拽的元素 (4)支持拖拽过程中的事件监听 实现思路: 元素可拖拽的实现关键为,mousedown.mousemove.mouseup三大事件.mousedown为按下触发拖动的事件,可以定义到元素本身或其他元素:mousemove为拖动范围元素的事件,该事件负责重新设置拖动元素的位置属性:mouseup为拖动范围元素的事件,该事件主要为了释放mousemove.mouseup事件. 为避免当拖动元素内容有较大内容时,重新绘

svg.draggable.js-实现svg拖拽的js插件

svg.draggable.js是一款基于svg.js的html5 svg拖拽插件.该插件可以使用svg.js生成的svg图像具有拖拽功能,并且可以限制拖拽范围,还可以制作拖拽幻影特效.该插件需要svg.js v0.11以上版本的支持. 在线演示:http://www.htmleaf.com/Demo/201501311305.html 下载地址:http://www.htmleaf.com/html5/SVG/201501311304.html

编写可拖拽的弹窗

可拖拽的弹窗 在刚刚重构完的项目中使用到了element ui框架,踩了不少坑也学到了不少的东西.其中比较麻烦的是它的dialog弹窗组件是无法移动拖拽的,然而客户又强烈的要求一定要有这个功能,所以就自己写了个可拖拽的弹窗组件.虽然拖拽起来不是很流畅,但是也算是满足要求了. 1. 实现原理 主要的实现原理还是获取鼠标在div中的位置,获取位置后设置div的left和top来达到div跟随鼠标移动的效果.因为写的是vue,所以利用了vue的自定义指令来操作dom. 2. 实现步骤 2-1 设计盒子

一步一步实现JS拖拽插件

js拖拽是常见的网页效果,本文将从零开始实现一个简单的js插件. 一.js拖拽插件的原理 常见的拖拽操作是什么样的呢?整过过程大概有下面几个步骤: 1.用鼠标点击被拖拽的元素 2.按住鼠标不放,移动鼠标 3.拖拽元素到一定位置,放开鼠标 这里的过程涉及到三个dom事件:onmousedown,onmousemove,onmouseup.所以拖拽的基本思路就是: 1.用鼠标点击被拖拽的元素触发onmousedown (1)设置当前元素的可拖拽为true,表示可以拖拽 (2)记录当前鼠标的坐标x,y