android随笔12——toast响应触摸事件以及移动

 * 窗体管理者,显示view 时,需要的布局参数 

WindowManager.LayoutParams params = new WindowManager.LayoutParams();

private View toastView;

 private void showAddress(String incomingNumber) {  

          String address = QueryAddressUtils.queryAddress(ctx, incomingNumber);

           //  Toast.makeText(ctx, address, 1).show();   

 // inflate 方法将布局文件转换为view 对象,返回的对象,就是布局文件的根节点  

toastView = View.inflate(ctx, R.layout.toast_show_address, null);  

TextView textView = (TextView) toastView.findViewById(R.id.tv_address);  

textView.setText(address);    

// 设置选择的样式  

int index = sp.getInt(MyConstace.key_select_style, 0); 

 toastView.setBackgroundResource(imageIds[index]);  

​



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;

//                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE

// 注掉此行,否则不能响应触摸事件       

params.format = PixelFormat.TRANSLUCENT;

//        params.windowAnimations = com.android.internal.R.style.Animation_Toast; // 声明窗体的动画效果               

// params.type 定义当前窗体的类型 TYPE_TOAST 类型的窗体,天生不能响应触摸事件       

params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;

// 修改为TYPE_PRIORITY_PHONE高优先级的窗体类型       

//注意添加权限 SYSTEM_ALERT_WINDOW 系统警告窗体​

params.setTitle("Itcast"); //设置标题 随意设置

------------------------移动--------------------------

//         params.gravity = Gravity.CENTER;

// 默认是居中对齐,当 x,y 坐标都为0时,toastView显示在屏幕的中心

              params.gravity = Gravity.LEFT+Gravity.TOP; // 改为左上对齐

// 读取设置,初始化位置

         params.x = sp.getInt("params_x", 0);        

         params.y = sp.getInt("params_y", 0);                 

// 将view 添加至屏幕        

wm.addView(toastView, params);                 

// 给 toastView 设置触事件        

toastView.setOnTouchListener(new View.OnTouchListener() {            

private int downX;         

private int downY;                              

* 上一个触事件中的坐标                    

private int lastX;         

private int lastY;             

    

* 当触摸 toastView 时,调用此方法    

* 如果 我们处理了事件,必须返回 true       

public boolean onTouch(View v, MotionEvent event) {        

switch (event.getAction()) { // 获得当前事件的动作类型    

case MotionEvent.ACTION_DOWN:        

//一:down 事件时,记录下触摸事件的X,Y坐标,downX,downY     

lastX=  downX = (int) event.getRawX(); // 获得触摸点,相对于屏幕左上角的X坐标     

lastY =  downY = (int) event.getRawY();// 获得触摸点,相对于屏幕左上角的Y坐标          break;    

case MotionEvent.ACTION_MOVE:    

// 二:move事件时,获得move事件的xy坐标,moveX,moveY     

int moveX = (int) event.getRawX();     

int moveY = (int) event.getRawY();          

// 三:获得二个相邻事件之间的距离,而不是应该是move和down事件之间的距离,改变view在屏幕上的位置,     

int disX = moveX -lastX;      

int disY = moveY -lastY;          

params.x+=disX;     

params.y+=disY;     

wm.updateViewLayout(toastView, params); // 使用新的布局参数,更新view,在屏幕上的位置          

// 四: 对上一个事件的XY坐标,进行重新赋值,方便下一次运算    

 lastX = moveX;     

lastY = moveY;          

break;    

case MotionEvent.ACTION_UP:

    //松手时,记录当前的位置     

sp.edit().putInt("params_x", params.x).commit();     

sp.edit().putInt("params_y", params.y).commit();              

 break;    }    

return true;   }  

});            

}

​



你可能感兴趣的:(android随笔12——toast响应触摸事件以及移动)