自定义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;
    }
时间: 2024-10-23 14:41:42

自定义Toast,显示号码归属地的 CustomToast的相关文章

android 自定义Toast显示风格

1.创建一个自己想要显示Toast风格的XML如下代码(toast_xml.xml): [html] view plaincopyprint? <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match

自定义Toast排队重复显示问题:

原文 http://blog.csdn.net/baiyuliang2013/article/details/38655495Toast是安卓系统中,用户误操作时或某功能执行完毕时,对用户的一种提示,它没有焦点,并在一定时间内会消失,但用户连续误操作(如登录时,密码错误)多次时,则会有多个Toast被创建,系统会把这些toast放进队列中,等待上个Toast 显示完毕,接着显示下一个,那么用户则会看到多次Toast提示,无论你退出软件与否,这样给用户的体验则大打折扣,所以我们需要做的是,若Toa

[android] 手机卫士来电显示号码归属地

继续N天前的项目 开启服务监听手机来电,查询数据库,显示归属地 详细内容可以参考这篇博文:http://www.cnblogs.com/taoshihan/p/5331232.html AddressService.java package com.qingguow.mobilesafe.service; import com.qingguow.mobilesafe.utils.NumberQueryAddressUtil; import android.app.Service; import

Android自定义Toast的时长、位置、及显示的View

Android自定义Toast 首先是自定义时长: 说是这么说,但是android自带的两个时长 LENGTH_SHORT (2秒) 和LENGTH_LONG (3.5秒)基本已经够用了,一般也没有特地去设置几十秒的Toast吧,这样的话,还不如直接弄一个Dialog来的直接. 我们先看看如何让Toast在3.5秒内自定义显示长度: public static void showShort(Context context, String msg, int duration) { final To

Android实例-手机安全卫士(四十二)-设置自定义Toast位置

一.目标 设置自定义Toast窗口的显示位置(第1-2步): 二.代码实现 1.在“显示号码归属地”服务(ShowPhoneAddService)类中的自定义吐司(myToast)方法中,通过窗口对象WindowManager.LayoutParams(params)的gravity属性可设置自定义Toast的对齐方式(顶部:Gravity.TOP,左上角:Gravity.TOP+Gravity.LEFT): 2.通过窗口对象WindowManager.LayoutParams(params)的

Android 高级自定义Toast及源码解析

Toast概述 Toast的作用 不需要和用户交互的提示框. 更多参见官网:https://developer.android.com/guide/topics/ui/notifiers/toasts.html Toast的简单使用 Toast.makeText(MainActivity.this.getApplicationContext(),"沉迷学习,日渐消瘦",Toast.LENGTH_SHORT).show() 自定义Toast Toast customToast = new

Android实例-手机安全卫士(四十三)-自由移动自定义Toast位置

一.目标 实现自定义的Toast窗口在来电时可以自由移动至屏幕的任意位置,并保存该位置 二.代码实现 1.在“显示号码归属地”服务(ShowPhoneAddService)类中的自定义吐司(myToast)方法中,在窗口对象WindowManager.LayoutParams(params,该变量在后面的移动显示位置时需要用到,所以将其定义成服务类的成员变量)的便签(flag)属性里,需删除不可触摸属性(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)

Android带图片的Toast(自定义Toast)

使用Android默认的Toast Toast简介: Toast是一个简单的消息显示框,能够短暂的出现在屏幕的某个位置,显示提示消息. 默认的位置是屏幕的下方正中,一般Toast的使用如下: Toast.makeText(this,"1222222",Toast.LENGTH_SHORT).show(); Toast是static修饰的静态类,意味着可以直接使用,所以可以不用创建对象直接调用makeText方法, 该方法需要传入三个参数: /** * Make a standard t

Android Toast进阶——自定义Toast

进阶目标 上一篇博客我们学习了Toast的源码,了解了Toast从显示到消失的全过程,学习链接:Android Toast源码分析 .俗话说的好,学以致用.我们学习Toast源码不是用来炫技的,而是用来了解Toast原理,从而真正解决我们问题的.下面我就提两个业务中可能遇到的跟Toast相关的真实问题,看看学习了Toast源码之后,该如何解决这些问题.两个问题是: 如何自定义Toast的显示时间. 如何修改Toast的出现动画. 接下来,我们分别讲解阅读了Toast源码之后,如何解决这两个业务中