Android实现带磁性的悬浮窗体效果
程序员文章站
2024-03-03 22:35:40
本文实例讲述了android实现带磁性的悬浮窗体效果。分享给大家供大家参考,具体如下:
带磁性的悬浮窗体,类似于360绿色小人
主要实现的是:
1.悬浮所有窗体之上...
本文实例讲述了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程序设计有所帮助。
上一篇: java图形界面之布局设计