android开发中内部如何实现悬浮可拖动按钮
来源:爱站网时间:2020-07-23编辑:网友分享
项目开发中,我们需要开发非常多不同的按钮,而悬浮按钮在移动端的开发中,却是必不可少的,下面是爱站技术频道小编分享的android开发中内部如何实现悬浮可拖动按钮,大家都觉得不错,一起跟着我们的步伐来学习吧!
项目开发中,我们需要开发非常多不同的按钮,而悬浮按钮在移动端的开发中,却是必不可少的,下面是爱站技术频道小编分享的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
主要的处理问题就是控件的拖动问题,通过重写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 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]
使用方法:
//传入上下文Activity ChatView chatView = new ChatView(this); chatView.show();
上文是爱站技术频道小编为大家带来的android开发中内部如何实现悬浮可拖动按钮,我们可以参考上面方法进行操作,项目的优化其实在开发中也是很重要的。
