ym——360悬浮窗效果(新)

来源:互联网 发布:中国网速和外国网络 编辑:程序博客网 时间:2024/06/13 03:29

转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持!


360悬浮窗效果

效果图:


所需权限:

<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/>

为什么小窗体能显示在窗体呢?

new TableShowView(this).fun();

因为我们开了一个服务,服务会在后台运行如果只是在activity中启动  

当activity跑去后台的时候[暂停态,或者销毁态] 我们设置的显示到桌

面的view也会消失所以这里采用的是启动一个服务,服务中创建我们需要

显示到table上的view,并将其注册到windowManager上   

 

Activity

public class MainActivity extends Activity {        @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         Button btn = (Button)findViewById(R.id.btn);        btn.setOnClickListener(new OnClickListener() {                       @Override            public void onClick(View v) {                // TODO Auto-generated method stub                funClick(null);            }        });           }     public void funClick(View v){         //按钮被点击        this.startService(new Intent(this,Mser.class));         this.finish();     } } <span style="color:#ff6666;"></span>

Service

public class Mser extends Service {     //服务     //这个类纯蛋疼用 只是为了在activity点击button后 在开启一个service         @Override     public IBinder onBind(Intentintent) {         // TODO Auto-generated method stub         return null;     }      public void onCreate() {           //创建service时一个 实例化一个TableShowView对象并且调用他的fun()方法把它注册到windowManager上         super.onCreate();         new TableShowView(this).fun();     }  } View:public class TableShowView extends View {         Context    c;    WindowManager             mWM;          WindowManager.LayoutParams  mWMParams;    View   win;    int tag = 0;    int oldOffsetX;    int oldOffsetY;    private WindowManager wm;     public TableShowView(Contextcontext) {        // TODO Auto-generated constructor stub        super(context);        c = context;    }     public void fun() {        // 拿到窗体管理器    mWM=(WindowManager)c.getSystemService(Context.WINDOW_SERVICE);        // 加载自己写的布局文件win = LayoutInflater.from(c).inflate(R.layout.ctrl_window,null);        // 设置背景透明的        win.setBackgroundColor(Color.TRANSPARENT);        // 设置触摸事件        win.setOnTouchListener(new OnTouchListener()// 记录移动前的坐标            float  lastX, lastY;            public boolean onTouch(View v, MotionEvent event) {                final int action =event.getAction();                float x = event.getX();                float y = event.getY();                if(tag == 0){// 记录触摸的位置                   oldOffsetX= mWMParams.x;                    oldOffsetY = mWMParams.y;                 }                if (action == MotionEvent.ACTION_DOWN) {                     Log.i("i", "ACTION_DOWN");                    // 按下的时候记录x,y                    lastX = x;                    lastY = y;                }                else if (action == MotionEvent.ACTION_MOVE) {                     Log.i("i", "ACTION_MOVE");                    // 当移动的时候 我们就改变图片的位置、                    // 用当前的位置减去原始的位置                    mWMParams.x += (int) (x -lastX);                    mWMParams.y += (int) (y -lastY);                    // 改变tag代表图片已经移动过                    tag = 1;                    // 修改图片在窗体内的的位置                    mWM.updateViewLayout(win,mWMParams);                }                else if (action ==  MotionEvent.ACTION_UP){                    // 如果当触摸离开屏幕的时候                     Log.i("i", "ACTION_UP");                    int newOffsetX =mWMParams.x;                    int newOffsetY =mWMParams.y;                           // 如果触摸的位置的抬起和放下中间没有移动过就属于点击            if(oldOffsetX == newOffsetX &&oldOffsetY == newOffsetY){                        Toast.makeText(c,"点到我了", 1).show();                        //wm.removeView(win);                    }else {                        // 否则记录现在位置                        tag = 0;                    }                }                return true;            }        });        wm = mWM;        // 布局参数WindowManager.LayoutParams wmParams = newWindowManager.LayoutParams();        mWMParams = wmParams;        // 类型// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT  =2003         wmParams.type = 2003;          // 标识        wmParams.flags = 40;        // 宽        wmParams.width = 50;        // 高        wmParams.height = 50;        // 格式  // PixelFormat.TRANSLUCENT= -3         wmParams.format = -3;         // 添加到窗体        wm.addView(win, wmParams);    } }

0 0
原创粉丝点击