android 应用内部悬浮可拖动按钮简单实现代码

android 应用内部悬浮可拖动按钮简单实现代码,第1张

概述本文介绍了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 <= 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 应用内部悬浮可拖动按钮简单实现代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1143954.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存