WindowとWindowManagerを利用して浮遊窓効果を実現する――Android開発芸術探求ノート
6564 ワード
転載を歓迎して、転載して原文のリンクを明記して下さい.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を追加する方法を示しています.
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
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とTypeFLAG
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時、同時声明
注
転載を歓迎して、転載して原文のリンクを明記して下さい.http://blog.csdn.net/l664675249/article/details/50850051