首页 > 代码库 > 自定义Toast,显示号码归属地的 CustomToast

自定义Toast,显示号码归属地的 CustomToast

技术分享

public class CustomToast implements OnTouchListener {

    private Context mContext;
    private View view;
    private WindowManager windowManager;
    private int startX;
    private int startY;
    private WindowManager.LayoutParams params;

    public CustomToast(Context context) {
        this.mContext = context;
    }

    /**
     * 显示号码归属地的toast address : 号码归属地 
     */
    public void showToast(String address) {
        //1.获取windowManager
        windowManager = (WindowManager) mContext
                .getSystemService(Context.WINDOW_SERVICE);

        //2.获取要添加到窗口中的布局对象
        view = View.inflate(mContext, R.layout.customtoast, null);
        // 初始化控件,将号码归属地放到textview中显示
        TextView mAddress = (TextView) view
                .findViewById(R.id.custom_tv_address);
        mAddress.setText(address);
        
        //获取保存的自定义Toast的背景,设置给控件显示
        int sp_bgid = SharedPreferencesTool.getInt(
mContext, Constants.ADDRESSBG, R.drawable.toast_address_normal); view.setBackgroundResource(sp_bgid);
//3.设置布局对象在窗口中显示的属性 //通过代码设置控件的属性,Andorid中每个父控件都是有自己的LayoutParams,每个layoutparams中都是根据控件设置有自己的相关属性代码的 //LayoutParams设置的属性效果,根据在布局文件中使用相应的属性设置效果是一样的 //使用layoutparams规则:将view对象添加到那个父控件中,就要使用那个父控件中的layoutparams,表示子控件遵循父控件的属性规则,这样子控件使用的属性才会生效,否则是有可能会失效 //例子:比如在ImageView中使用layout_centerVertical属性,ImageView必须是RelativeLayout,如果是Linearlayout的子控件,是不能使用layout_centerVertical params = new WindowManager.LayoutParams(); params.height = WindowManager.LayoutParams.WRAP_CONTENT;//设置高度包裹内容 params.width = WindowManager.LayoutParams.WRAP_CONTENT;//设置宽度包裹内容 params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE //不能获取焦点 //| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE //不能触摸 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; //保持屏幕长亮 params.format = PixelFormat.TRANSLUCENT; //设置背景透明效果 params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;

// 设置控件是否toast类型,toast天生没有触摸事件,TYPE_PRIORITY_PHONE:优先于电话Ui的类型 //设置view对象的触摸事件,实现view对象随着手指移动而移动的效果 view.setOnTouchListener(this); //4.将params设置给view对象,再将view对象添加到windowManager中显示 windowManager.addView(view, params); } /** * 隐藏自定义toast */ public void hideToast() { if (view != null) { // getParent() : 获取view父控件 if (view.getParent() != null) { windowManager.removeView(view); } view = null; windowManager = null; } } /** * View触摸事件,用来实现view对象随着手指移动而移动的操作 */ @Override public boolean onTouch(View v, MotionEvent event) { // getAction() : 获取控件具体的触摸事件 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //1.获取开始位置的x和y的坐标 startX = (int) event.getRawX(); startY = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: //2.获取移动到的位置的x和y的坐标 int newX = (int) event.getRawX(); int newY = (int) event.getRawY(); //3.计算自定义toast移动的距离 int dX = newX - startX; int dY = newY - startY; //4.将自定义Toast移动相应的距离,params.x:控件的x的坐标 params.x+=dX; params.y+=dY; //在新的位置将控件重新刷新出来 windowManager.updateViewLayout(view, params);//重新刷新控件的位置 //5.重新设置开始移动的位置 startX = newX; startY = newY; break; case MotionEvent.ACTION_UP: break; } //返回true:事件执行,返回false:执行不执行 return true; }

 

自定义Toast,显示号码归属地的 CustomToast