Android实现带磁性的悬浮窗体效果

Android实现带磁性的悬浮窗体效果,第1张

概述本文实例讲述了Android实现带磁性悬浮窗体效果。分享给大家供大家参考,具体如下:

本文实例讲述了AndroID实现带磁性的悬浮窗体效果。分享给大家供大家参考,具体如下:

带磁性的悬浮窗体,类似于360绿色小人

主要实现的是:

1.悬浮所有窗体之上
2.有吸引力,吸附于屏幕边上
3.有点击效果

下面我就实现上面三点,简单封装了个floatVIEw

先看下本次Demo的效果图,然后再看代码,

效果图:

floatVIEw代码如下

package com.manymore13.flowwindowdemo;import androID.content.Context;import androID.graphics.PixelFormat;import androID.graphics.Rect;import androID.util.AttributeSet;import androID.util.displayMetrics;import androID.util.Log;import androID.vIEw.Gravity;import androID.vIEw.MotionEvent;import androID.vIEw.WindowManager;import androID.vIEw.WindowManager.LayoutParams;import androID.Widget.ImageVIEw;/** * @author manymore13 * @version 1.0 */public class floatVIEw extends ImageVIEw{  private float mtouchX;  private float mtouchY;  private float x;  private float y;  private int startX;  private int startY;  private Context c;  private int imgID = R.drawable.ic_launcher;  private int controlledspace = 20;  private int screenWIDth;  boolean isShow = false;  private OnClickListener mClickListener;  private WindowManager windowManager ;  private WindowManager.LayoutParams windowManagerParams = new WindowManager.LayoutParams();  public floatVIEw(Context context,AttributeSet attrs) {    super(context,attrs);  }  public floatVIEw(Context c)  {    super(c);    initVIEw(c);  }  // 初始化窗体  public voID initVIEw(Context c)  {    windowManager = (WindowManager) c.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);    screenWIDth = windowManager.getDefaultdisplay().getWIDth();    this.setimageResource(imgID);    windowManagerParams.type = LayoutParams.TYPE_PHONE;    windowManagerParams.format = PixelFormat.RGBA_8888; // 背景透明    windowManagerParams.flags = LayoutParams.FLAG_NOT_touch_MODAL        | LayoutParams.FLAG_NOT_FOCUSABLE;    // 调整悬浮窗口至左上角,便于调整坐标    windowManagerParams.gravity = Gravity.left | Gravity.top;    // 以屏幕左上角为原点,设置x、y初始值    windowManagerParams.x = 0;    windowManagerParams.y = 200;    // 设置悬浮窗口长宽数据    windowManagerParams.wIDth = LayoutParams.WRAP_CONTENT;    windowManagerParams.height = LayoutParams.WRAP_CONTENT;  }  public voID setimgResource(int ID)  {    imgID = ID;  }  @OverrIDe  public boolean ontouchEvent(MotionEvent event) {    x = event.getRawX();    y = event.getRawY();    switch(event.getAction())    {      case MotionEvent.ACTION_DOWN:      {        mtouchX = event.getX();        mtouchY = event.getY();        startX = (int) event.getRawX();        startY = (int) event.getRawY();        break;      }      case MotionEvent.ACTION_MOVE:      {        updateVIEwposition();        break;      }      case MotionEvent.ACTION_UP:      {        if(Math.abs(x - startX) < controlledspace && Math.abs(y - startY) < controlledspace)        {          if(mClickListener != null)          {            mClickListener.onClick(this);          }        }        Log.i("tag","x="+x+" startX+"+startX+" y="+y+" startY="+startY);        if(x <= screenWIDth/2)        {          x = 0;        }else{          x = screenWIDth;        }        updateVIEwposition();        break;      }    }    return super.ontouchEvent(event);  }  // 隐藏该窗体  public voID hIDe()  {    if(isShow)    {      windowManager.removeVIEw(this);      isShow = false;    }  }  // 显示该窗体  public voID show()  {    if(isShow == false)    {      windowManager.addVIEw(this,windowManagerParams);      isShow = true;    }  }  @OverrIDe  public voID setonClickListener(OnClickListener l) {     this.mClickListener = l;  }  private voID updateVIEwposition() {     // 更新浮动窗口位置参数     windowManagerParams.x = (int) (x - mtouchX);     windowManagerParams.y = (int) (y - mtouchY);     windowManager.updateVIEwLayout(this,windowManagerParams); // 刷新显示  }}

完整实例代码点击此处本站下载

如果需要用上面的类可以这样做

floatVIEw = new floatVIEw(this); // 创建窗体floatVIEw.setonClickListener(this); // 设置事件,你需要实现floatVIEw里的onclick接口floatVIEw.show(); // 显示该窗体floatVIEw.hIDe(); // 隐藏窗体

PS 不要忘记在manifest里加上权限(更多manifest功能与权限可参考本站:AndroID Manifest功能与权限描述大全:http://tools.jb51.net/table/AndroidManifest)

上面有个BUG 就是点击的时候vIEw下移

public int getStatusbarHeight() {    int TitlebarHeight = 0;    Rect frame = new Rect();    mAct.getwindow().getDecorVIEw().getwindowVisibledisplayFrame(frame);    TitlebarHeight = frame.top;    if (TitlebarHeight == 0) {      int resourceID = getResources().getIDentifIEr("status_bar_height","dimen","androID");      if (resourceID > 0) {        TitlebarHeight = getResources().getDimensionPixelSize(resourceID);      }    }    return TitlebarHeight;}

更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android编程之activity *** 作技巧总结》、《Android资源 *** 作技巧汇总》、《Android文件 *** 作技巧汇总》、《Android *** 作SQLite数据库技巧总结》、《Android *** 作json格式数据技巧总结》、《Android数据库 *** 作技巧总结》、《Android编程开发之SD卡 *** 作方法汇总》、《Android开发入门与进阶教程》、《Android视图View技巧总结》及《Android控件用法总结》

希望本文所述对大家AndroID程序设计有所帮助。

总结

以上是内存溢出为你收集整理的Android实现带磁性的悬浮窗体效果全部内容,希望文章能够帮你解决Android实现带磁性的悬浮窗体效果所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/web/1148866.html

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

发表评论

登录后才能评论

评论列表(0条)

保存