1. 程式人生 > >仿ios touch按鈕建立可隨意拖動的懸浮按鈕

仿ios touch按鈕建立可隨意拖動的懸浮按鈕

WindowManager mWindowManager;
WindowManager.LayoutParams wmParams;
LinearLayout mFloatLayout;
ImageView mFloatView;

private void createFloatView() {
    //獲取LayoutParams物件
wmParams = new WindowManager.LayoutParams();

    //獲取的是LocalWindowManager物件
mWindowManager = this.getWindowManager();
    Log.i(TAG, "mWindowManager1--->" 
+ this.getWindowManager()); //mWindowManager = getWindow().getWindowManager(); Log.i(TAG, "mWindowManager2--->" + getWindow().getWindowManager()); //獲取的是CompatModeWrapper物件 //mWindowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE); Log.i(TAG, "mWindowManager3--->"
+ mWindowManager); wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; wmParams.format = PixelFormat.RGBA_8888; wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; wmParams.gravity = Gravity.LEFT | Gravity.TOP; wmParams.x = 0; wmParams.y = 100; wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT; wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT; LayoutInflater inflater = this
.getLayoutInflater();//LayoutInflater.from(getApplication()); mFloatLayout = (LinearLayout) inflater.inflate(R.layout.home_easy_touch_view, null); mWindowManager.addView(mFloatLayout, wmParams); //setContentView(R.layout.main); mFloatView = (ImageView) mFloatLayout.findViewById(R.id.easy_touch_view_imageview); Log.i(TAG, "mFloatView" + mFloatView); Log.i(TAG, "mFloatView--parent-->" + mFloatView.getParent()); Log.i(TAG, "mFloatView--parent--parent-->" + mFloatView.getParent().getParent()); //繫結觸控移動監聽 mFloatView.setOnTouchListener(mTouchListener); } private View.OnTouchListener mTouchListener = new View.OnTouchListener() { float lastX, lastY; int paramX, paramY; private int mOldOffsetX; private int mOldOffsetY; private int mTag = 0; public boolean onTouch(View v, MotionEvent event) { final int action = event.getAction(); float x = event.getRawX(); float y = event.getRawY(); if (mTag == 0) { mOldOffsetX = wmParams.x; // ƫ���� mOldOffsetY = wmParams.y; // ƫ���� } switch (action) { case MotionEvent.ACTION_MOVE: wmParams.x = (int) event.getRawX() - mFloatLayout.getWidth() / 2; //25為狀態列高度 wmParams.y = (int) event.getRawY() - mFloatLayout.getHeight() / 2 - 40; mWindowManager.updateViewLayout(mFloatLayout, wmParams); mTag = 1; break; case MotionEvent.ACTION_UP: motionActionUpEvent(x, y); break; default: break; } return true; } private void motionActionUpEvent(float x, float y) { int newOffsetX = wmParams.x; int newOffsetY = wmParams.y; if (Math.abs(mOldOffsetX - newOffsetX) > 50 || Math.abs(mOldOffsetY - newOffsetY) > 50) { mTag = 0; } else { try { Intent intentUhome = new Intent(); PackageManager packageManager = getPackageManager(); intentUhome = packageManager.getLaunchIntentForPackage(SpeechUtil.AVS_PROCESS_NAME); intentUhome.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intentUhome); } catch (Exception ex) { ex.toString(); } } }

};

home_easy_touch_view.xml程式碼:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical" >

    <ImageView
android:id="@+id/easy_touch_view_imageview"
android:layout_width="200px"
android:layout_height="250px"
android:background="@drawable/icon_avs" />

</LinearLayout>

往android6.0的系統上執行時,會崩潰,丟擲permission denied for this window type異常。但在AndroidMenafest.xml中已經添加了SYSTEM_ALERT_WINDOW的許可權,

解決方法:

wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;改成
wmParams.type = WindowManager.LayoutParams.TYPE_TOAST;即可。