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

上一篇:Android开发之如何实现多语言的实例展示

下一篇:Android开发中使用textinputlayout创建登录页面的实现步骤

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载