首页 > 代码库 > 自定义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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。