
本文介绍了androID 应用内部悬浮可拖动按钮简单实现代码,分享给大家,具体如下:
可以悬浮在activity上面,在加载fragment时悬浮按钮不会消失
实现方式很简单,因为是在应用内部拖动的,只需要通过Activity获取WindowManager,然后将要拖动的vIEw设置上去就行
设置代码:
WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE); displayMetrics dm = new displayMetrics(); activity.getwindowManager().getDefaultdisplay().getMetrics(dm); //通过像素密度来设置按钮的大小 dpi = dpi(dm.densityDpi); //屏宽 screenWIDth = wm.getDefaultdisplay().getWIDth(); //屏高 screenHeight = wm.getDefaultdisplay().getHeight(); //布局设置 wmParams = new WindowManager.LayoutParams(); // 设置window type wmParams.type = WindowManager.LayoutParams.TYPE_APPliCATION; wmParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明 wmParams.gravity = Gravity.left | Gravity.top; // 设置Window flag wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; wmParams.wIDth = dpi; wmParams.height = dpi; wmParams.y = (screenHeight - dpi) >> 1; wm.addVIEw(this,wmParams);
控件的大小根据像素密度来进行设置的
/** * 根据密度选择控件大小 * */ private int dpi(int densityDpi) { if (densityDpi <= 120) { return 36; } else if (densityDpi <= 160) { return 48; } else if (densityDpi <= 240) { return 72; } else if (densityDpi <= 320) { return 96; } return 108; }主要的处理问题就是控件的拖动问题,通过重写ontouchEvent方法进行处理
源码:
import androID.app.Activity;import androID.content.Context;import androID.graphics.PixelFormat;import androID.util.displayMetrics;import androID.vIEw.Gravity;import androID.vIEw.LayoutInflater;import androID.vIEw.MotionEvent;import androID.vIEw.VIEw;import androID.vIEw.WindowManager;import androID.Widget.relativeLayout;import androID.Widget.TextVIEw;/** * Created by xiang on 2016/12/28. * * im悬浮窗视图 */public class ChatVIEw extends relativeLayout{ // 悬浮栏位置 private final static int left = 0; private final static int RIGHT = 1; private final static int top = 3; private final static int BUTTOM = 4; private int dpi; private int screenHeight; private int screenWIDth; private WindowManager.LayoutParams wmParams; private WindowManager wm; private float x,y; private float mtouchstartX; private float mtouchstartY; private boolean isScroll; public ChatVIEw(Activity activity) { super(activity); LayoutInflater.from(activity).inflate(R.layout.vIEw_chat,this); setBackgroundResource(R.drawable.chat_btn); wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE); displayMetrics dm = new displayMetrics(); activity.getwindowManager().getDefaultdisplay().getMetrics(dm); //通过像素密度来设置按钮的大小 dpi = dpi(dm.densityDpi); //屏宽 screenWIDth = wm.getDefaultdisplay().getWIDth(); //屏高 screenHeight = wm.getDefaultdisplay().getHeight(); //布局设置 wmParams = new WindowManager.LayoutParams(); // 设置window type wmParams.type = WindowManager.LayoutParams.TYPE_APPliCATION; wmParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明 wmParams.gravity = Gravity.left | Gravity.top; // 设置Window flag wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; wmParams.wIDth = dpi; wmParams.height = dpi; wmParams.y = (screenHeight - dpi) >> 1; wm.addVIEw(this,wmParams); hIDe(); } /** * 根据密度选择控件大小 * */ private int dpi(int densityDpi) { if (densityDpi <= 120) { return 36; } else if (densityDpi <= 160) { return 48; } else if (densityDpi <= 240) { return 72; } else if (densityDpi <= 320) { return 96; } return 108; } public voID show() { if (isShown()) { return; } setVisibility(VIEw.VISIBLE); } public voID hIDe() { setVisibility(VIEw.GONE); } public voID destory() { hIDe(); wm.removeVIEwImmediate(this); } @OverrIDe public boolean ontouchEvent(MotionEvent event) { // 获取相对屏幕的坐标, 以屏幕左上角为原点 x = event.getRawX(); y = event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // setBackgroundDrawable(openDrawable); // invalIDate(); // 获取相对VIEw的坐标,即以此VIEw左上角为原点 mtouchstartX = event.getX(); mtouchstartY = event.getY(); break; case MotionEvent.ACTION_MOVE: if (isScroll) { updateVIEwposition(); } else { // 当前不处于连续滑动状态 则滑动小于图标1/3则不滑动 if (Math.abs(mtouchstartX - event.getX()) > dpi / 3 || Math.abs(mtouchstartY - event.getY()) > dpi / 3) { updateVIEwposition(); } else { break; } } isScroll = true; break; case MotionEvent.ACTION_UP: // 拖动 if (isScroll) { autoVIEw(); // setBackgroundDrawable(closeDrawable); // invalIDate(); } else { // 当前显示功能区,则隐藏 // setBackgroundDrawable(openDrawable); // invalIDate(); } isScroll = false; mtouchstartX = mtouchstartY = 0; break; } return true; } /** * 自动移动位置 */ private voID autoVIEw() { // 得到vIEw在屏幕中的位置 int[] location = new int[2]; getLocationOnScreen(location); //左侧 if (location[0] < screenWIDth / 2 - getWIDth() / 2) { updateVIEwposition(left); } else { updateVIEwposition(RIGHT); } } /** * 手指释放更新悬浮窗位置 * */ private voID updateVIEwposition(int l) { switch (l) { case left: wmParams.x = 0; break; case RIGHT: int x = screenWIDth - dpi; wmParams.x = x; break; case top: wmParams.y = 0; break; case BUTTOM: wmParams.y = screenHeight - dpi; break; } wm.updateVIEwLayout(this,wmParams); } // 更新浮动窗口位置参数 private voID updateVIEwposition() { wmParams.x = (int) (x - mtouchstartX); //是否存在状态栏(提升滑动效果) // 不设置为全屏(状态栏存在) 标题栏是屏幕的1/25 wmParams.y = (int) (y - mtouchstartY - screenHeight / 25); wm.updateVIEwLayout(this,wmParams); }}使用方法:
//传入上下文ActivityChatVIEw chatVIEw = new ChatVIEw(this);chatVIEw.show();
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的android 应用内部悬浮可拖动按钮简单实现代码全部内容,希望文章能够帮你解决android 应用内部悬浮可拖动按钮简单实现代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)