dragView 屏幕拖拽并且弹出菜单的控件
dragView
因项目新需求需要添加一个屏幕拖拽按钮可以弹出菜单的控件,因为不是我做的闲来无事写一个demo吧 可能存在一些小bug(毕竟就写了几个小时)兄弟姐妹们理解思路就行 具体的可以自己调试一下 废话不多说先来一个gif走一走(调了帧数 可能看着比较快 不要介意)
GitHub 传送车https://github.com/guanhaoran/dragView
gif有点小 对付看吧 (太大了传github的时候 会出错 放图片还看不出来效果 不要介意)

废话不多话直接看代码
1.写一个类继承 Button 重写构造方法&onTouchEvent(MotionEvent event)
public DragView(Context context) {
this(context, null); }
public DragView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
//获取屏幕宽高,用于控制控件在屏幕内移动
DisplayMetrics dm = getResources().getDisplayMetrics();
mScreenWidth = dm.widthPixels;
mScreenHeight = dm.heightPixels - 100;//这里减去的100是下边的back键和menu键那一栏的高度,看情况而定
showPopup = new ShowPopup(context);
}
2.onTouchEvent(MotionEvent event)
大家可能看的不太懂 先大体看下结构 稍后我会在代码里加上注释 确保每条代码都有注释一些没有的 我就不会加注释 也浪费大家时间
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event); int lastMoveX = 0;
int lastMoveY = 0;
switch (event.getAction()) { case MotionEvent.ACTION_DOWN:
falg = true;
startDownX = (int) event.getRawX();
startDownY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
if (showPopup.isShowing()) {
showPopup.dissPopup();
}
lastMoveX = (int) event.getRawX();
lastMoveY = (int) event.getRawY(); int dx = lastMoveX - startDownX;
int dy = lastMoveY - startDownY;
if (Math.abs(dx) > 2 || Math.abs(dy) > 2) {
falg = false;
} left = getLeft() + dx;
top = getTop() + dy;
right = getRight() + dx;
bottom = getBottom() + dy;
if (left < 0) {
left = 0;
right = left + getWidth();
}
if (right > mScreenWidth) {
right = mScreenWidth;
left = right - getWidth();
}
if (top < 0) {
top = 0;
bottom = top + getHeight();
}
if (bottom > mScreenHeight) {
bottom = mScreenHeight;
top = bottom - getHeight();
}
layout(left, top, right, bottom);
Log.i("____________________", left + "___" + top + "___" + right + "___" + bottom);
invalidate();
startDownX = (int) event.getRawX();
startDownY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
int lastMoveDx = Math.abs((int) event.getRawX() - startDownX);
int lastMoveDy = Math.abs((int) event.getRawY() - startDownY);
if (falg) {
ToastUtils.showToast(context, "我点击了");
showContent(360, true);
}
falg = false;
break;
}
return true;
3.点击按钮出现的一个小圆点 这个使用popupWindow做的包括背景颜色变暗也是在popupWindow中实现的 这个稍后也会有注释 我只是写完了 不喜欢写注释
(这个毛病很坏 - -)private void showContent(int angles, boolean isShow) {
if (showPopup.isShowing()) {
showPopup.dissPopup();
} else {
int excursionX = -(getWidth() / 2) - 5;
int excursionY = 0;
if (left == 0 && right == 0 && top == 0 && bottom == 0) {
excursionX = -(getWidth() / 2)-5;
excursionY = 0;
} else if (left < 50 && top < 50) {
excursionX = getWidth();
excursionY = 0;
} else if (mScreenWidth - right < 50 && top < 50) {
excursionX = -getWidth() * 2 - 20;
excursionY = 0;
} else if (mScreenWidth - right < 50 && mScreenHeight - bottom < getHeight()*2) {
excursionX = -getWidth() * 2 - 20;
excursionY = -getHeight() * 3 - 20;
} else if (mScreenHeight - bottom < getHeight()*2 && left < 50) {
excursionX = getWidth();
excursionY = -getHeight() * 3 - 20;
} else if (left < 50) {
excursionX = getWidth();
excursionY = -getHeight() - getHeight() / 2;
} else if (top < 50) {
excursionX = -(getWidth() / 2)-10;
excursionY = -10;
} else if (mScreenWidth - right < 50) {
excursionX = -getWidth() * 2 - 10;
excursionY = -getHeight() - getHeight() / 2 - 10;
} else if (mScreenHeight - bottom < getHeight() * 2.5) {
excursionX = -getWidth() / 2 -10;
excursionY = -getHeight() * 3 - 10;
} else {
}
showPopup.showPopup(this, excursionX, excursionY);
}
}
4.还有一个popupWindow 我就不贴在这里了 大家可以看代码就好了,可能代码包结构很乱大家不要介意,我也是为了效果别的我也没注意
最后我在上传GitHub的时候 哇!!!很痛苦 全是英文(奈何我的英文还不好)传了好久才传上去 下一篇文章我会把GitHub的使用给兄弟们详详细细的说一遍
GitHub 传送车https://github.com/guanhaoran/dragView
QQ:765307272
dragView 屏幕拖拽并且弹出菜单的控件的更多相关文章
- asp.net 弹出式日历控件 选择日期 Calendar控件
原文地址:asp.net 弹出式日历控件 选择日期 Calendar控件 作者:逸苡 html代码: <%@ Page Language="C#" CodeFile=&quo ...
- 2015-11-04 asp.net 弹出式日历控件 选择日期 Calendar控件
html代码: <%@ Page Language="C#" CodeFile="calendar.aspx.cs" Inherits="cal ...
- Web之-----弹出确认框控件应用
引用文件!-------- <link rel="stylesheet" type="text/css" href="@Url.FrontUrl ...
- Swing-JPopupMenu弹出菜单用法-入门
弹出菜单是GUI程序中非常常见的一种控件.它通常由鼠标右击事件触发,比如在windows系统桌面上右击时,会弹出一个包含“刷新”.“属性”等菜单的弹出菜单.Swing中的弹出菜单是JPopupMenu ...
- win32进阶之路:程序托盘图标+右键弹出菜单
开场白 本次介绍两个非常棒且实用的技巧:程序托盘图标和右键弹出菜单,效果如下图. 程序托盘图标用了迅雷的图标,右键点击时候会弹出三个选项的菜单. 程序托盘图标设置 我会用尽可能清晰明了的步骤介绍方式 ...
- 【Android】创建Popwindow弹出菜单的两种方式
方法一的Activity package com.app.test02; import android.app.Activity; import android.os.Bundle; import a ...
- 【转】android创建Popwindow弹出菜单的两种方式
方法一的Activity package com.app.test02; import android.app.Activity; import android.os.Bundle; import a ...
- iOS 弹出菜单UIMenuController的基本使用
UIMenuController,弹出菜单@implementation DragView{ CGPoint startLocation; CGFloat rotation;}-(inst ...
- 用PopupWindow实现弹出菜单(弹出的菜单采用自定义布局)
用PopupWindow实现弹出菜单是一个比较好的方式.当然我们还有一个类PopupMenu也能实现弹出菜单,但那个太过于局限了,所以不是很推荐. 这个实例的效果是这样的:点击按钮后,一个菜 ...
随机推荐
- 关于pc端 app端pdf,word xls等文件预览的功能
第一种用H5标签<iframe>标签实现 返回的文件类型,文件流,文件流返回必须在设置 contentType对应的Mime Type, 返回文件的物理位置. 已经实测可以支持的文件类型 ...
- VMware VCSA 6.0安装过程 (转)
VMware VCSA 6.0安装过程(专版) 一.环境准备 VMware vCenter Server Appliance(VCSA)6.0的部署和之前的版本不同,在5.5及之前的版本可以通过 ...
- Pyhton学习——Day1
1.什么是机器码?什么是字节码?机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来理解的话,机器码就是计 ...
- swap空间可以有效缓解内存压力
不太了解底层的人对swap空间的概念也很模糊,这里我简单举例,看看swap空间的作用 查看当前swap空间:3个方式 [root@localhost /home/xxx/kirin/os_diagno ...
- 网络教程(7)OSI模型的低层模型
OSI Model——Open System Interconnection Model 开放系统互联模型
- 基于 SpringMVC——web.xml基本配置
<!--声明应用范围内的初始化参数--> <context-param> <param-name>contextConfigLocation</param-n ...
- nmcli connection modify eth1 ipv4.addr "192.168.31.23" ipv4.method manual
nmcli connection modify eth1 ipv4.addr "192.168.31.23/24" ipv4.method manual 修改IP地址
- 《黑白团团队》第七次作业:团队项目设计完善&编码
项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 任务1:团队软件项目设计完善 Github仓库上传<软件设计方案说明书 ...
- centos solr 部署到 tomcat 上
一.安装 java1.7 环境 链接:https://pan.baidu.com/s/1ti6j9jD-RwUN5xl3bc3ZDw 密码:oc9a 二.下载 tomcat 并解压 链接:https: ...
- String String s = new String("asd") 涉及对象数目
问题·:.String str = new String("abc")创建了多少个对象? 这个问题在很多书籍上都有说到比如<Java程序员面试宝典>,包括很多国内大公司 ...