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开发中内部如何实现悬浮可拖动按钮,我们可以参考上面方法进行操作,项目的优化其实在开发中也是很重要的。