自定义可拖动的Toast
package com.loaderman.toastdemo; import android.content.Context;
import android.graphics.PixelFormat;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView; /**
*
* 自定义归属地吐司
* <p/>
* 让窗口布局响应触摸事件:
* 1. 去掉FLAG_NOT_TOUCHABLE的标记
* 2. 调整显示级别为TYPE_PHONE, 可以支持触摸
* 3. 加权限: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
*/
public class AddressToast { private WindowManager mWM;
private View mView;
private final WindowManager.LayoutParams mParams;
private final TextView tvAddress;
private int startX;
private int startY; private Context mContext;
private int[] mIcons = new int[]{R.drawable.shape_address_normal, R.drawable
.shape_address_orange, R.drawable.shape_address_blue, R.drawable.shape_address_gray,
R.drawable.shape_address_green};
public AddressToast(Context ctx) {
mContext = ctx; //窗口管理器
//窗口: android系统中最顶级的布局, 任何的界面和组件都显示在窗口中, Activity, 状态栏, dialog
//当需要在第三方app中显示布局时, 由于没有activity可以依托,此时可以直接使用WindowManager在窗口上添加布局
mWM = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE); //初始化布局参数, 定义当前布局的宽高,位置,显示方式等信息
mParams = new WindowManager.LayoutParams();
mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;//高度包裹内容
mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;//宽度包裹内容
mParams.format = PixelFormat.TRANSLUCENT;//显示格式,默认就行
//params.windowAnimations = com.android.internal.R.style.Animation_Toast;//窗口动画
mParams.type = WindowManager.LayoutParams.TYPE_PHONE;//类型, 吐司类型(不支持触摸)
//params.setTitle("Toast");//标题
//标记, 保持屏幕常亮, 没有焦点, 不可触摸
mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; // mParams.x;
// mParams.y; //初始化布局
// mView = new TextView(ctx);
// mView.setText(text);
// mView.setTextColor(Color.RED);
// mView.setTextSize(25);
mView = View.inflate(ctx, R.layout.toast_address, null);
tvAddress = (TextView) mView.findViewById(R.id.tv_address);
//设置窗口布局的触摸事件
mView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println("按下...");
//1.记录起点坐标
startX = (int) event.getRawX();
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
System.out.println("移动...");
//2. 记录移动后的坐标
int moveX = (int) event.getRawX();
int moveY = (int) event.getRawY();
//3. 计算偏移量
int dx = moveX - startX;
int dy = moveY - startY;
//4. 根据偏移量更新布局位置
mParams.x += dx;
mParams.y += dy;
mWM.updateViewLayout(mView, mParams);//更新控件位置 //5. 重新初始化起点坐标
startX = moveX;
startY = moveY;
break;
case MotionEvent.ACTION_UP:
System.out.println("抬起...");
break;
default:
break;
}
return true;//消费掉此事件
}
});
} //显示布局
public void show(String text) {
//mView.setText(text);
tvAddress.setText(text);
//获取当前选中的样式
tvAddress.setBackgroundResource(mIcons[0]);//重新设置背景
//给窗口添加布局对象
mWM.addView(mView, mParams);
} //隐藏布局
public void hide() {
if (mWM != null && mView != null) {
//移除窗口布局
//布局没有添加给窗口时, 从窗口移除布局就会出异常
try {
mWM.removeView(mView);
} catch (Exception e) {
e.printStackTrace();
}
}
} }
package com.loaderman.toastdemo; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View; public class MainActivity extends AppCompatActivity {
private AddressToast mToast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToast = new AddressToast(this);
}
public void display(View view){
mToast.show("自定义的哦");
}
public void hide(View view){
mToast.hide();
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.loaderman.toastdemo.MainActivity"> <Button
android:id="@+id/btn_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="display"
android:text="显示"/>
<Button
android:id="@+id/btn_hide"
android:onClick="hide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="隐藏"/>
</LinearLayout>
toast_address.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"> <TextView
android:id="@+id/tv_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_address_normal"
android:drawableLeft="@drawable/location"
android:text="未知号码"
android:padding="8dp"
android:textColor="@color/white"
android:textSize="18sp"/>
</LinearLayout>
在res/drawable下
shape_address_blue.xml shape_address_gray.xml shape_address_green.xml shape_normal_blue.xml shape_address_orange.xml只需要把下面代码需要以下color即可
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--颜色-->
<solid android:color="@color/global_blue"/>
<!--给矩形加圆角-->
<corners android:radius="6dp"/>
</shape>
在res/values/colors.xml添加需求颜色值即可如
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="red">#F00</color>
<color name="black">#000</color>
<color name="gray">#a000</color>
<color name="global_blue">#459FD7</color>
<color name="white">#fff</color>
<color name="light_gray">#cccccc</color>
<color name="light_green">#00ffa1</color>
</resources>
添加权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
效果图:

自定义可拖动的Toast的更多相关文章
- 自定义带动画的Toast
		一.style样式: 1. // 移动和透明渐变结合的动画 <style name="anim_view"> <item name="@ ... 
- Android特效专辑(三)——自定义不一样的Toast
		Android特效专辑(三)--自定义不一样的Toast 大家都知道,Android的控件有时候很难满足我们的需求,所以我们需要自定义View.自定义的方式很多,有继承原生控件也有直接自定义View的 ... 
- ToastCustom【自定义显示风格的Toast】
		版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 基于系统Toast的自定义显示风格的Toast. 效果图 代码分析 ToastCustom类基于系统Toast,不是继承Toast, ... 
- Android自定义Seekbar拖动条式样
		SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性 ... 
- 自定义垂直拖动的seekbar进度条
		系统自定义的seekbar为横向拖动的样式,需要纵向的时则需要自己定义,网上很多说了重写系统SeekBar中onDraw()的方法,但是我使用的时候不知道为什么拖动条和点偏离了,不在一条直线上,好气. ... 
- Android自定义可拖动的悬浮按钮
		在页面上随意拖动的按钮 public class MoveScaleRotateView extends RelativeLayout { private Context mContext; //默认 ... 
- vue2.0  自定义  提示框(Toast)组件
		1.自定义 提示框 组件 src / components / Toast / index.js /** * 自定义 提示框( Toast )组件 */ var Toast = {}; var sho ... 
- vue 自定义 提示框(Toast)组件
		1.自定义 提示框 组件 src / components / Toast / index.js /** * 自定义 提示框( Toast )组件 */ var Toast = {}; var sho ... 
- vue自定义指令拖动div
		钩子函数一个指令定义对象可以提供如下几个钩子函数:bind:只掉用一次,指令第一次绑定到元素是调用,在这里可以进行一次性的初始化设置inserted:被绑定元素插入父节点时调用(仅保证父节点存在,但不 ... 
随机推荐
- python函数:函数使用原则、定义与调用形式
			一.函数初始 二.函数的使用原则 三.函数的定义与调用形式 四.函数的返回值 五.函数参数的使用 一.函数初始 # 须知一: # 硬盘空间无法修改,硬盘中的数据更新都是用新的内容覆盖旧的内容 # 内存 ... 
- java8  stream().map().collect()用法
			有一个集合: List<User> users = getList(); //从数据库查询的用户集合 现在想获取User的身份证号码:在后续的逻辑处理中要用: 常用的方法我们大家都知道,用 ... 
- cypress 3
			https://blog.csdn.net/u014647208/article/details/80525226 https://blog.csdn.net/kulala082/article/de ... 
- WPF绑定命令
			一.目的 降低代码耦合度(降低UI层和BLL层的代码耦合度),将UI层的后台代码更好的转移到BLL层中,让视图和业务逻辑分离的更好 二.使用方式 1.创建一个RelayCommand,继承IComma ... 
- maven命令创建web骨架项目
			maven命令创建web骨架项目有以下两种方式: mvn archetype:create -DgroupId=org.seckill -DartifactId=seckill -Darchetype ... 
- spring-cloud  /pause  平滑升级 踩坑记录
			0.客户端添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ... 
- hive中的 lateral view
			lateral view用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合. 一个简单的例子,假设我们有一张表pageAds,它有 ... 
- oracle rowtype
			v_customer customerinfo%rowtype; select * into v_customer from customerinfo where guid = v_loan.cust ... 
- maven项目创7   配置分页插件
			页面编写顺序 首先确定是否拥有想要的pojo(对象实体类)———>dao层mybatis配置——>service层的接口及实现类——>controller(web下) 分页插件作 ... 
- 二叉树的序遍历x(内含结构体与非结构体版x)
			3143 codevs 二叉树的序遍历 题目描述 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description 第一行一个整数n,表示这棵树的节点个 ... 
