111.归属地悬浮框的拖拽

来源:互联网 发布:11 选5遗漏数据查询 编辑:程序博客网 时间:2024/04/28 03:56

params.type = WindowManager.LayoutParams.TYPE_TOAST响应TOAST

params.type = WindowManager.LayoutParams.TYPE_PHONE;响应打电话,电话窗口,电话窗口适合电话交互

占用打电话的窗口,需要权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

View响应点击事件更新view的坐标 view.setOnTouchListener

AddressActivity.java

package com.ldw.safe.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.content.SharedPreferences.Editor;import android.graphics.PixelFormat;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.WindowManager;import android.widget.TextView;import com.ldw.safe.R;import com.ldw.safe.db.dao.AddressDao;/* * 来电提醒的服务 */public class AddressService extends Service {private TelephonyManager tm;private MyListener listener;private OutCallReceiver receiver;private WindowManager mWM;private int startX;private int startY;//private TextView view;private View view;private SharedPreferences mPref;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate(){super.onCreate();//读取样式的配置参数mPref = getSharedPreferences("config", MODE_PRIVATE);tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);listener = new MyListener();tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//监听打电话的状态receiver = new OutCallReceiver();IntentFilter filter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);registerReceiver(receiver, filter);//动态注册广播}class MyListener extends PhoneStateListener{//监听电话状态的变化@Overridepublic void onCallStateChanged(int state, String incomingNumber){//switch(state){//电话铃声响起case TelephonyManager.CALL_STATE_RINGING:System.out.println("CALL_STATE_RINGING");//获取来电的号码归属地String address = AddressDao.getAddress(incomingNumber);//Toast的形式弹出号码归属地//Toast.makeText(AddressService.this, address, Toast.LENGTH_LONG).show();//自定义的Toast显示号码归属地showToast(address);break;//监听电话闲置的事件case TelephonyManager.CALL_STATE_IDLE://关闭自定义的Toast显示if(mWM != null && view != null){//挂断电话的时候,移除窗体mWM.removeView(view);}break;default:break;}super.onCallStateChanged(state, incomingNumber);}}/* * 监听去电 的广播接收者,添加权限PROCESS_OUTGOING_CALLS */class OutCallReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {//获取到来电的号码String number = getResultData();//获取到号码的归属地String address = AddressDao.getAddress(number);//Toast的形式弹出号码归属地//Toast.makeText(context, address, Toast.LENGTH_LONG).show();//自定义的Toast显示号码归属地showToast(address);}}    @Override    public void onDestroy(){    super.onDestroy();    //关闭服务,停止来电监听    tm.listen(listener, PhoneStateListener.LISTEN_NONE);        //注销广播    unregisterReceiver(receiver);    }        /*     * 自定义归属地显示浮窗,取代Toast,需要权限SYSTEM_ALERT_WINDOW     */    private void showToast(String text){    mWM = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);        //获取屏幕的宽度和高度    final int winWidth = mWM.getDefaultDisplay().getWidth();    final int winHeight = mWM.getDefaultDisplay().getHeight();        final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();        final WindowManager.LayoutParams params = mParams;        params.height = WindowManager.LayoutParams.WRAP_CONTENT;        params.width = WindowManager.LayoutParams.WRAP_CONTENT;        params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;        params.format = PixelFormat.TRANSLUCENT;        params.type = WindowManager.LayoutParams.TYPE_PHONE;        //将重心位置设置成左上方(0,0),默认实在重心位置        params.gravity = Gravity.LEFT + Gravity.TOP;        params.setTitle("Toast");                //获取到之前归属地显示的坐标        int lastX = mPref.getInt("lastX", 0);        int lastY = mPref.getInt("lastY", 0);                //params.x和 params.y是设置基于左上方的偏移量        params.x = lastX;        params.y = lastY;                //原始的view显示        //view = new TextView(this);                //自定义的view显示        view = View.inflate(this, R.layout.toast_address, null);                //初始化样式        int[] bgs = new int[] { R.drawable.call_locate_white,R.drawable.call_locate_orange, R.drawable.call_locate_blue,R.drawable.call_locate_gray, R.drawable.call_locate_green };        //获取保存的样式数据int style = mPref.getInt("address_Style", 0);//设置样式view.setBackgroundResource(bgs[style]);                TextView tvAddress= (TextView) view.findViewById(R.id.tv_address);        tvAddress.setText(text);        //tvAddress.setTextColor(Color.BLUE);        //将view添加到窗体        mWM.addView(view, params);                //view响应点击事件        view.setOnTouchListener(new OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event) {System.out.println("onTouch...");switch(event.getAction()){case MotionEvent.ACTION_DOWN://获取起始点在屏幕中的坐标startX = (int) event.getRawX(); startY = (int) event.getRawY(); break;case MotionEvent.ACTION_MOVE://获取结束点的坐标int endX = (int) event.getRawX();int endY = (int) event.getRawY();//计算偏移量int dx = endX - startX;int dy = endY - startY;//更新选民付出的位置params.x += dx;params.y += dy;//窗口x,y的最小最大的范围的限制,防止坐标越界if(params.x < 0){params.x = 0;}if(params.y < 0){params.y = 0;}if(params.x > winWidth - view.getWidth()){params.x =  winWidth - view.getWidth();}if(params.y > winHeight - view.getHeight()){params.y = winHeight - view.getHeight();}//窗口更新位置mWM.updateViewLayout(view, params);System.out.println("params.x" + params.x + "params.y" +params.y);// 重新初始化起点坐标startX = (int) event.getRawX();startY = (int) event.getRawY();break;case MotionEvent.ACTION_UP:// 编辑保存记录坐标点Editor edit = mPref.edit();edit.putInt("lastX", params.x);edit.putInt("lastY", params.y);edit.commit();break;}return true;}                });    }}

0 0