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

转载请注明本文出自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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值