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
- ym——360悬浮窗效果(新)
- ym—— OutputStream(新)
- ym——对象序列化(新)
- ym——Java多线程(新)
- 360悬浮窗效果
- ym——Android从零开始(7)(SQLite数据库)(新)
- ym——Android从零开始(9)(ContentProvider内容提供者)(新)
- ym——Android从零开始(17)(多线程下载-上)(新)
- ym——Android从零开始(18)(多线程下载-下)(新)
- ym——Android从零开始(20)(TabHost+ExpandableListView)(新)
- ym——Android从零开始(21)(自定义控件)(新)
- ym——Android从零开始(19)(BroadcastReceiver)(新)
- ym——Android从零开始(22)(service、aidl)(新)
- ym——Android从零开始(23)(Notification+ Animation)(新)
- ym——Android从零开始(24)(多媒体播放器)(新)
- ym——Android从零开始(27)(山寨版微信-上)(新)
- ym——Android从零开始(27)(山寨版微信-下)(新)
- ym——Android从零开始(29)(Bluetooth2.0+4.0)(新)
- 菜鸟的安卓实习之路----关于EditText的最大长度maxLength和密码类型InputType的获取
- Leetcode - Basic - Palindrome Number
- hdu2092-水题
- MFC 剪贴板操作
- 最快速的编程学习方法究竟是什么?
- ym——360悬浮窗效果(新)
- 根据ID列表提取fasta序列
- 八数码游戏 A*算法
- 选择打印
- 20140808
- 数据科学学习笔记(use R)(1)
- XIB 绑定
- JS中怎么获取input所在页面的绝对坐标
- 游标与视图的比较