Android:可移动悬浮框
16lz
2021-12-04
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.content.SharedPreferences;
- importandroid.content.SharedPreferences.Editor;
- importandroid.graphics.PixelFormat;
- importandroid.os.Bundle;
- importandroid.util.Log;
- importandroid.view.Gravity;
- importandroid.view.LayoutInflater;
- importandroid.view.MotionEvent;
- importandroid.view.View;
- importandroid.view.View.OnTouchListener;
- importandroid.view.WindowManager;
- importandroid.view.WindowManager.LayoutParams;
- importandroid.widget.TextView;
- publicclassFrameActivityextendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- privatestaticfinalStringTAG="FloatFrameActivity";
- privatestaticfinalbooleanDEBUG=true;
- privateViewmViews;
- privateTextViewmView;
- //窗口管理器
- privateWindowManagermWindowManager;
- //布局参数
- privateWindowManager.LayoutParamsmLayoutParams;
- //上次使用时悬浮框在屏幕中的坐标
- privateintlastX=0;
- privateintlastY=0;
- //屏幕大小
- privatestaticintmWidth;
- privatestaticintmHidth;
- @Override
- protectedvoidonPause(){
- super.onPause();
- //保存最后一次使用的位置
- SharedPreferenceslocation=getSharedPreferences("Location",Context.MODE_PRIVATE);
- Editoredit=location.edit();
- edit.putInt("lastX",lastX);
- edit.putInt("lastY",lastY);
- edit.commit();
- if(DEBUG)Log.i(TAG,"--->onPaust");
- }
- @Override
- protectedvoidonStart(){
- super.onStart();
- //取出上次使用的位置
- SharedPreferenceslocation=this.getSharedPreferences("Location",Context.MODE_PRIVATE);
- lastX=location.getInt("lastX",(mWidth-mViews.getWidth())/2);
- lastY=location.getInt("lastY",(mHidth-mViews.getHeight())/2);
- updateFloatFrame();
- if(DEBUG)Log.i(TAG,"--->onStart");
- }
- @Override
- protectedvoidonDestroy(){
- super.onDestroy();
- removeFloatFrame();
- if(DEBUG)Log.i(TAG,"--->onDestroy");
- }
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //得到屏幕的大小
- mWidth=getWindowManager().getDefaultDisplay().getWidth();
- mHidth=getWindowManager().getDefaultDisplay().getHeight();
- //显示悬浮窗
- init();
- if(DEBUG)Log.i(TAG,"--->onCreate");
- }
- //删除悬浮框
- privatevoidremoveFloatFrame(){
- mWindowManager.removeView(mViews);
- if(DEBUG)Log.i(TAG,"--->FloatFrameremoved");
- }
- //更新悬浮框
- privatevoidupdateFloatFrame(){
- mLayoutParams.x=lastX;
- mLayoutParams.y=lastY;
- mWindowManager.updateViewLayout(mViews,mLayoutParams);
- if(DEBUG)Log.i(TAG,"--->FloatFrameupdated");
- }
- privatevoidinit(){
- /*必须添加权限:<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/>
- */
- //获得窗口管理器
- mWindowManager=(WindowManager)this.getSystemService(Context.WINDOW_SERVICE);
- mLayoutParams=newLayoutParams();
- //悬浮框布局
- mLayoutParams.width=LayoutParams.WRAP_CONTENT;
- mLayoutParams.height=LayoutParams.WRAP_CONTENT;
- mLayoutParams.gravity=Gravity.LEFT|Gravity.TOP;
- //悬浮框在屏幕中的初始位置
- mLayoutParams.x=lastX;
- mLayoutParams.y=lastY;
- mLayoutParams.type=LayoutParams.TYPE_PHONE;
- //设置半透明
- mLayoutParams.format=PixelFormat.TRANSLUCENT;
- mLayoutParams.flags=LayoutParams.FLAG_NOT_FOCUSABLE|LayoutParams.FLAG_NOT_TOUCH_MODAL;
- //获得悬浮窗布局视图
- mViews=LayoutInflater.from(this).inflate(R.layout.frame,null);
- //从悬浮窗布局视图中获取显示电话号码的TextView
- mView=(TextView)mViews.findViewById(R.id.text_view);
- //将悬浮框添加到窗口管理器中
- mWindowManager.addView(mViews,mLayoutParams);
- //给整个悬浮框添加OnTouch事件
- mView.setOnTouchListener(newOnTouchListener(){
- floatx=0,y=0;
- publicbooleanonTouch(Viewv,MotionEventevent){
- switch(event.getAction()){
- caseMotionEvent.ACTION_DOWN:
- x=event.getX();
- y=event.getY();
- break;
- caseMotionEvent.ACTION_MOVE:
- updateViewPosition(v,event);
- break;
- caseMotionEvent.ACTION_UP:
- break;
- }
- returntrue;
- }
- //更新悬浮框
- privatevoidupdateViewPosition(Viewv,MotionEventevent){
- lastX=(int)(event.getRawX()-x);
- //38为状态栏的宽度
- lastY=(int)(event.getRawY()-y)-38;
- //窗口管理器更新悬浮框
- updateFloatFrame();
- }
- });
- }
- }
Java代码
- <?xmlversion="1.0"encoding="utf-8"?>
- <TextViewxmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/text_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:background="@android:color/transparent"
- android:layout_gravity="center"
- android:text="悬浮框">
- </TextView>
更多相关文章
- Android(安卓)技术博客(3):android 悬浮窗菜单,可用于显示在 launche
- Android(安卓)响应键盘移动图标
- android manifest相关属性
- android点亮(唤醒)屏幕
- android
- Android(安卓)利用adb命令 使App自动点击屏幕指定位置
- Android(安卓)-- DisplayMetrics
- android定制对话框
- android 获取屏幕高度和宽度