2012年11月12日月曜日

[Android SDK] ImageViewを最前面にフローティングさせる

ドラッグ可能なリストビューを作成する過程で、ドラッグ中のアイテムを最前面でフローティングさせるのに苦労しましたので、そのやり方を記載します。
★オレンジ色の浮いているやつです。


実際は、ドラッグ対象のアイテムをBitmap化として、ImageViewで最前面に表示しています。

1.ViewをBitmapに変換する

たとえば、ListViewであれば、getChildAtでアイテムをViewとして取得できます。Bitmapを生成して、Canvasで描画すれば、簡単にViewをBitmapに変換できます。
// View view;
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas();
canvas.setBitmap(bitmap);
view.draw(canvas);
// (e.g.)
// ImageView imageView;
// imageView.setImageBitmap(bitmap);

2.ImageViewを最前面に表示する

最前面に表示するには、ImageViewをWindowManagerに追加します。
WindowManager.addView(View, WindowManager.LayoutParams)メソッドを使います。なお、いらなくなったらWindowManager.removeView(View)で削除できます。
WindowManager mWindowMgr = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mWindowMgr.addView(imageView, layoutParams);
レイアウトパラメータを指定する必要があり、任意の位置に表示するのであれば次の値がいいと思います。
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.gravity = Gravity.TOP | Gravity.LEFT;
layoutParams.x       = 0; // 表示位置 x
layoutParams.y       = 0; // 表示位置 y
layoutParams.width   = WindowManager.LayoutParams.WRAP_CONTENT;
layoutParams.height  = WindowManager.LayoutParams.WRAP_CONTENT;
layoutParams.flags   = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
layoutParams.format  = PixelFormat.TRANSLUCENT; // 透明を有効化

3.ImageViewの透明度指定

ドラッグ中のアイテムを見やすくするために、ImageViewを透過します。
ImageView.setAlpha(int)メソッドを使います。0〜255で透明度を指定します。値が大きいほど不透明になります。
//ImageView imageView;
imageView.setAlpha(128); // 透明度50% 

ただ、WindowManagerで透明度を有効にするには、必ず次を指定しておく必要があります。
// WindowManager.LayoutParams layoutParams;
layoutParams.format  = PixelFormat.TRANSLUCENT; // 透明を有効化

4.ImageViewを移動させるには

WindowManager.updateViewLayout(View, WindowManager.LayoutParams)メソッドでレイアウトを更新します。
WindowManager.addView(View, WindowManager.LayoutParams)メソッド時のWindowManager.LayoutParamsを保持しておき、x,y座標を変更して使いますと楽です。
// WindowManager mWindowMgr;
// WindowManager.LayoutParams layoutParams;
// ImageView imageView;
layoutParams.x       = 0; // 表示位置 x
layoutParams.y       = 0; // 表示位置 y
mWindowMgr.updateViewLayout(imageView, layoutParams);

こんな感じに、最前面でImageViewを自由に移動させらました。
ご参考にしてみてください。


0 件のコメント:

コメントを投稿