WindowとWindowManagerを利用して浮遊窓効果を実現する――Android開発芸術探求ノート


転載を歓迎して、転載して原文のリンクを明記して下さい.http://blog.csdn.net/l664675249/article/details/50850051
Windowはウィンドウの概念を表しています.例えば、デスクトップやロックスクリーンに浮遊窓のようなものを表示する必要がある時はWindowを使います.Windowは抽象類で、Windowの実現類はPhone Windowです.Windowの具体的な実現はWindowManager Serviceにあり、WindowManagerとWindowManager Serviceの相互作用はIPCプロセスである.AndroidのすべてのビューはWindowによって表されています.Activity、Dialog、Toastに関わらず、彼らのビューは実際にWindowに添付されています.
浮遊窓の例
Buttonボタンをクリックして、ImageViewを座標が(100,300)の位置に追加して、簡単にドラッグすることができます.
次はこの区間のソースコードです.Window Managerを使ってWindowを追加する方法を示しています.
public class TestActivity extends Activity implements OnTouchListener {

    private static final String TAG = "TestActivity";

    private Button mCreateWindowButton;

    private ImageView mImageView;
    private WindowManager.LayoutParams mLayoutParams;
    private WindowManager mWindowManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        initView();
    }

    private void initView() {
        mCreateWindowButton = (Button) findViewById(R.id.button1);
        mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    }

    public void onButtonClick(View v) {

        if (v == mCreateWindowButton) {
            mImageView = new ImageView(this);
            mImageView.setBackgroundResource(R.drawable.ic_launcher);
            mLayoutParams = new WindowManager.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0, 0,
                    PixelFormat.TRANSPARENT);
            mLayoutParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | LayoutParams.FLAG_NOT_FOCUSABLE
                    | LayoutParams.FLAG_SHOW_WHEN_LOCKED;
            mLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR;
            mLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;
            mLayoutParams.x = 100;
            mLayoutParams.y = 300;
            mImageView.setOnTouchListener(this);
            mWindowManager.addView(mImageView, mLayoutParams);
        }
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int rawX = (int) event.getRawX();
        int rawY = (int) event.getRawY();
        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            Log.d(TAG, "onTouch: rawX " + rawX);
            Log.d(TAG, "onTouch: rawY " + rawY);
            mLayoutParams.x = rawX;
            mLayoutParams.y = rawY;
            mWindowManager.updateViewLayout(mImageView, mLayoutParams);
            break;
        }
        case MotionEvent.ACTION_UP: {
            break;
        }
        default:
            break;
        }
        return false;
    }

    @Override
    protected void onDestroy() {
        try {
            mWindowManager.removeView(mImageView);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
        super.onDestroy();
    }
}
WindowManager.LayoutParaamsのFlaagとType
FLAG
  • FLAG_NOT_FOCUSABLEでは、現在Windowはフォーカスを取得していません.各種入力イベントも受け付けていません.FLAG_を同時に有効にします.NOT_TOUCHMODALでは、イベントは下の階に焦点を当てたWindowに伝達されます.
  • FLAG_NOT_TOUCHMODALは、現在Windowエリア外のクリックイベントを下の階に転送し、エリア内のクリックイベントは自分で処理します.一般的にはオープンする必要があります.
  • FLAG_SHOWWHENLOCKEDは、Windowをロック画面に表示させることができます.
  • Type
    TypeはWindowのタイプを表しています.Window、サブWindowとシステムWindowがあります.Windowを使って、一つのActivityに対応します.レベル1~99.子供Windowは単独では存在できません.特定の父親Windowが必要です.例えば、一般的なDialogです.レベル1000~1999.システムWindowは、Toastなどの権限声明が必要です.レベル2000~2999.
    WindowManager.LayoutParaams.TYPESYSTEM_ERRORまたはTYPE_SYSTEM_OVERLAYは同時に権限を宣言します.WindowManager.LayoutParaams.TYPEを使用します.SYSTEM_ERROR時、同時声明
  • Windowは実際には存在しません.Viewという形で存在します.Windowごとに1つのViewとView RootImplに対応しています.WindowとViewはView RootImplを通じて連絡を作ります.だから実際に使っていますが、実際のWindowにはアクセスできません.Window Managerを通じてのみ利用できます.
  • WindowManagerでよく使われる3つの機能:addView、udateView Layout、removeView
  • オンデマンド()のmWindowManager.removeView(mImageView)
  • を忘れないでください.
    転載を歓迎して、転載して原文のリンクを明記して下さい.http://blog.csdn.net/l664675249/article/details/50850051