Android自定义Toast之WindowManager
作者:c123sdn123 发布时间:2022-10-27 09:13:10
本文为大家分享了Android自定义Toast之WindowManager,供大家参考,具体内容如下
Toast:WindowManager
三个重要的API:
public void addView(View view, ViewGroup.LayoutParams params);
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
相当于布局文件中的属性
public void removeView(View view);
一定要销毁,否则无法退出程序。一定要移除,否则报异常
Toast:WindowManager
Toast:setView
自定义Toast:WindowManager 步骤
1) 获取WindowManager对象
2)产生WindowManager.LayoutParams(并且设置参数)
3)产生一个View
4)显示:addView(view,mParams);
5) 隐藏:removeView(view);
6) 更新位置一:view:设置一个OnTouchListener:ACTION_DONW,ACTION_MOVE,ACTION_UP
7) 更新位置二:updateViewLayout(view,mParams)
8)写成AddressToast
布局文件
<TextView
android:id="@+id/tv_custom_toast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="人间仙境"
android:drawableLeft="@drawable/address"
android:gravity="center_vertical"
android:drawablePadding="5dp"
android:padding="10dp"
/>
封装的工具类
public class AddressToast {
private WindowManager mWm;
private WindowManager.LayoutParams mParams;
private Context mContext;
private View mV;
public AddressToast(Context context){
this.mContext = context;
// 1 获取WindowManger 对象
mWm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
// 2 产生LayoutParams
mParams = new WindowManager.LayoutParams();
// 3 设置相关参数
mParams.width=WindowManager.LayoutParams.WRAP_CONTENT;
mParams.height=WindowManager.LayoutParams.WRAP_CONTENT;
mParams.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
// params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
// | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
}
//显示文本
public void show(String msg){
// 4 产生一个View
mV = View.inflate(mContext, R.layout.view_toast, null);
// 5 WindowManager:addView(view,params);
mWm.addView(mV, mParams);
}
public void hide() {
if (mV != null) {
if (mV.getParent() != null) {
mWm.removeView(mV);
}
mV = null;
}
}
}
调用工具类的逻辑:
public void clickMe2(View v) {
mToast = new AddressToast(this);
mToast.show("好迪真好大家好才是....");
}
public void clickMe3(View v) {
mToast.hide();
}
//onPause()一定要执行,否则报错
@Override
protected void onPause() {
super.onPause();
//remove
if(mV!=null){
if(mV.getParent()!=null){
mWm.removeView(mV);
}
mV=null;
}
}
对产生的view设置接触监听事件
刚刚的弹出的window还不能移动,可设置接触添加mv.setOnTouchListener(this)并实现接口OnTouchListener中的onTouch方法:
@Override
public boolean onTouch(View v, MotionEvent event) {
// getX是获取以widget左上角为坐标原点计算的X轴坐标值
// getRawX 获取的是以屏幕左上角为坐标原点计算的X轴坐标值
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Log.d("example", "ACTION_DOWN");
mDownX = event.getRawX();
mDownY = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
// Log.d("example", "ACTION_MOVE");
float moveX = event.getRawX();
float moveY = event.getRawY();
// x
int dx = (int) (moveX - mDownX + 0.5f); // 0.5f 四舍五入 (int)4.1 4
int dy = (int) (moveY - mDownY + 0.5f);
Log.d("example", "dx=" + dx);
mParams.x += dx;
mParams.y += dy;
//7.更新位置二
mWm.updateViewLayout(mV, mParams);
// 重新给按下去点赋值
mDownX = moveX;
mDownY = moveY;
break;
case MotionEvent.ACTION_UP:
// Log.d("example", "ACTION_UP");
break;
default:
break;
}
return false;
}
}
来源:https://blog.csdn.net/c123sdn123/article/details/52235254


猜你喜欢
- 1. 什么是RESTREST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状
- C语言的指针相当的灵活方便,但也相当容易出错。许多C语言初学者,甚至C语言老鸟都很容易栽倒在C语言的指针下。但不可否认的是,指针在C语言中的
- 作用:1、定时执行某种功能2、重复执行、定时重复执行、定次数执行某种功能类别:1、 Thread(new Runnable)2、T
- 本文实例实现一个如下图所示的Android自定义控件,可以直观地展示某个球队在某个赛季的积分数和胜场、负场、平局数首先对画布进行区域划分,整
- 前言MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供
- 一、面向对象的4个基本特征抽象性、封装性、继承性和多态性。抽象性分为过程抽象和数据抽象。封装性封装将数据以及加在这些数据上的操作组织在一起,
- /** * 冒泡排序估计是每本算法书籍都会提到的排序方法。 * 它的基本思路是对长度为N的序列,用N趟来将其排成有序序列。 * 第1趟
- 本文实例为大家分享了Android实现多条目加载展示的具体代码,供大家参考,具体内容如下展示效果依赖testCompile 'jun
- 本文实例讲述了C#设计模式之Mediator中介者模式解决程序员的七夕缘分问题。分享给大家供大家参考,具体如下:一、理论定义中介者模式&nb
- NavMesh(导航网格)是3D游戏世界中用于动态物体实现自动寻路的技术。NavMesh系统是人工智能的一种,它使用一个添加在游戏对象上或者
- 一、定时任务的使用场景和常见的定时任务某个时间定时处理某个任务、发邮件、短信、消息提醒、订单通知、统计报表等定时任务划分单机定时任务:单机的
- 相信绝大多数.NET玩家和我一样,常常使用Timer这个对象,而在WPF中使用DispatcherTimer的人也是很多,Dispatche
- Ionic是一款流行的移动端开发框架,但是刚入门的同学会发现,Ionic在iOS和Android的底部tabs显示不一样。在安卓情况下底部t
- 本文汇总了android 8种对话框(Dialog)使用方法,分享给大家供大家参考,具体内容如下1.写在前面Android提供了丰富的Dia
- 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时
- 学习过java基础,最近趁着大量课余时间想学习Android开发。百度很多资料Android studio,由Google开发的开发工具,那
- 一、解码流程解码流程大致分为以下三个部分,以FFmpge源码下的ffmpeg\doc\examples\decode_audio.c为参考。
- 如下所示:package cn.jdk.foreach;import java.util.HashMap;import java.util.
- Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java
- 管理fragment的生命周期有些像管理activity的生命周期。Fragment可以生存在三种状态:Resumed:Fragment在一