时间:2021-05-20
本文介绍了android 应用内部悬浮可拖动按钮简单实现代码,分享给大家,具体如下:
可以悬浮在activity上面,在加载fragment时悬浮按钮不会消失
实现方式很简单,因为是在应用内部拖动的,只需要通过Activity获取WindowManager,然后将要拖动的view设置上去就行
设置代码:
控件的大小根据像素密度来进行设置的
/** * 根据密度选择控件大小 * */ 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();以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在制作商城类微信小程序的过程中,我们经常会碰到需要增加可拖动悬浮图标的情况,本文简单的介绍一下可拖动悬浮按钮的实现。运行截图:主要代码:js:varstartP
WPF实现窗体中的悬浮按钮,按钮可拖动,吸附停靠在窗体边缘。控件XAML代码:控件cs代码:usingSystem;usingSystem.Collection
Android打开相册选择单张图片实现代码以下就是如何在应用中打开图库并选择一张图片进行应用,代码很简单,注释很详细。实现代码:btn8.setOnClickL
悬浮操作按钮(FloatingActionButton,FAB),或者说悬浮按钮,是Android应用中最常见的一个控件。悬浮按钮通常是圆形,底部的Materi
Android中FloatingActionButton(悬浮按钮)使用不是特别多,常规性APP应用中很少使用该控件.当然他的使用方法其实很简单.直接上代码:x