懸浮窗的實現
摘要:
1. FloatWindowView類
package comi.example.liy.firstbasicproject.entityClass;
import android.content.Context;
import android.util.Log;
import andr...
1. FloatWindowView類
package comi.example.liy.firstbasicproject.entityClass; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.LinearLayout; import android.widget.TextView; import comi.example.liy.firstbasicproject.R; /** * Created by liy on 2018-10-12 13:09 */ public class FloatWindowView extends LinearLayout { private WindowManager windowManager; private TextView textView1; private TextView textView2; public static int viewWidth; public static int viewHeight; private int inputStartX = 0; private int inputStartY = 0; private int viewStartX = 0; private int viewStartY = 0; private int inMovingX=0; private int inMovingY=0; private WindowManager.LayoutParams mParams; public FloatWindowView(Context context) { super(context); windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); LayoutInflater.from(context).inflate(R.layout.float_window,this); View view = findViewById(R.id.float_window_layout); textView1 = (TextView) view.findViewById(R.id.accumulative_consumption); textView2 = (TextView)view.findViewById(R.id.accumulative_quantity); viewHeight = view.getLayoutParams().height; viewWidth = view.getLayoutParams().width; } @Override public booleanonTouchEvent(MotionEvent event){ switch (event.getAction()){ case MotionEvent.ACTION_DOWN: inputStartX = (int)event.getRawX(); inputStartY = (int)event.getRawY(); viewStartX = mParams.x; viewStartY = mParams.y; break; case MotionEvent.ACTION_MOVE: inMovingX = (int)event.getRawX(); inMovingY = (int)event.getRawY(); updatePosition(); break; default: break; } Log.v("X-Y", "inputStartX: "+inputStartX+"\n" +"inputStartY: "+inputStartY+"\n" +"viewStartX: "+viewStartX+"\n" +"viewStartY: "+viewStartY+"\n" +"inMovingX: "+inMovingX+"\n" +"inMovingY: "+inMovingY+"\n"); return super.onTouchEvent(event); } private void updatePosition(){ mParams.x =viewStartX + inMovingX - inputStartX; mParams.y =viewStartY + inMovingY- inputStartY; windowManager.updateViewLayout(this,mParams); } public void setmParams( WindowManager.LayoutParams params){ mParams = params; } public void setData(String data1,String data2){ textView1.setText(data1); textView2.setText(data2); } }
2. float_window.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#99149FEB" android:padding="5dp" android:layout_gravity="center" android:id="@+id/float_window_layout"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/textView6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="本月消費(元):" android:textStyle="bold" android:textColor="@color/white" android:textSize="@dimen/character_3"/> <TextView android:id="@+id/accumulative_consumption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:textStyle="bold" android:textColor="@color/white" android:textSize="@dimen/character_3" android:text="" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/textView8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:textStyle="bold" android:textColor="@color/white" android:textSize="@dimen/character_3" android:text="累計筆數(筆):" /> <TextView android:id="@+id/accumulative_quantity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="@dimen/character_3" android:layout_weight="1" android:textStyle="bold" android:textColor="@color/white" android:text="" /> </LinearLayout> </LinearLayout>
3. FloatWindowActivity類
package comi.example.liy.firstbasicproject.ui.activity; import android.app.Activity; import android.graphics.PixelFormat; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.Gravity; import android.view.WindowManager; import comi.example.liy.firstbasicproject.R; import comi.example.liy.firstbasicproject.entityClass.FloatWindowView; import comi.example.liy.firstbasicproject.persist.Settings; /** * Created by liy on 2018-10-12 13:15 */ public class FloatWindowActivity extends Activity { private Settings settings;//設定 private FloatWindowView floatWindowView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_float_window); settings = Settings.getInstance(this); } @Override protected void onResume() { super.onResume(); creatFloatWindowView(); showFloatWindowData("200","1000"); } @Override protected void onStop() { getWindowManager().removeView(floatWindowView); floatWindowView = null; super.onStop(); } //建立懸浮窗 private void creatFloatWindowView(){ WindowManager windowManager = getWindowManager(); int screenHeight = windowManager.getDefaultDisplay().getHeight(); int screenWidth = windowManager.getDefaultDisplay().getWidth(); WindowManager.LayoutParams params = new WindowManager.LayoutParams(); if(floatWindowView == null){ floatWindowView = new FloatWindowView(this); params.type = WindowManager.LayoutParams.TYPE_APPLICATION; params.format = PixelFormat.RGBA_8888; params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; params.gravity = Gravity.START| Gravity.TOP; params.width =FloatWindowView.viewWidth; params.height = FloatWindowView.viewHeight; params.x = screenWidth; params.y = screenHeight/2; floatWindowView.setmParams(params); windowManager.addView(floatWindowView,params); } } //顯示懸浮窗資料 public void showFloatWindowData(String data1,String data2){ floatWindowView.setData(data1,data2); } }
4. activity_float_window.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> </LinearLayout>
5. 顯示效果如下圖所示,移動手指可上下左右滑動。

floatWindow.png