写一个简单的代码:
WindowManager mWm =
(WindowManager)getSystemService(Context.WINDOW_SERVICE);
Button view = new
Button(this);
view.setText("window manager
test!");
WindowManager.LayoutParams
mParams = new WindowManager.LayoutParams(); mWm.addView(view,
mParams);
我们这个button的显示和当前的运行环境基本上是无关的,当前是什么Activity或者是桌面,使用这个底层的结果给我们的编程带来很大的灵活性,但是要注意,显示出来就要销毁掉,这个是必须滴,销毁其实也就是一个remove方法。
但是仅仅这样子写会有个问题,就是view显示在最上层,但是后面的view无法获取焦点,当我们touch的坐标超出上次view的范围时
mParams = new
WindowManager.LayoutParams();
mWm.updateViewLayout(view,mParams);
需要后面的view获取焦点时:
mParams.flags =
WindiwManager.LayoutParams.FLAG_NOT_TOUCHABLE
|
WINDOWMANAGER>LAYOUTPARAMS.FLAG_NOT_FOCUSABLE;
mWm.updateViewLayout(view,mParams);
package com.lin.ui;
import
android.app.Activity;
import
android.graphics.PixelFormat;
import
android.os.Bundle;
import
android.os.Handler;
import
android.os.Message;
import
android.view.Gravity;
import
android.view.MotionEvent;
import
android.view.View;
import
android.view.WindowManager;
import
android.view.WindowManager.LayoutParams;
import
android.widget.ImageView;
import
android.widget.ViewFlipper;
public class ButtonDrag
extends Activity {
// 声明两个按钮,分别代表向左和向右滑动
private ImageView btnLeft
= null;
private ImageView
btnRight = null;
// 设置WindowManager
private WindowManager wm
= null;
private
WindowManager.LayoutParams wmParams = null;
// ImageView的alpha值
private int mAlpha =
0;
private boolean
isHide;
private ViewFlipper
viewFlipper = null;
@Override
public void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drag);
setTitle("Android实现渐显按钮的左右滑动效果");
viewFlipper =
(ViewFlipper)findViewById(R.id.myViewFlipper);
// 初始化左右按钮
initImageButtonView();
}
private void
initImageButtonView() {
// 获取WindowManager
wm = (WindowManager)
getApplicationContext().getSystemService("window");
// 设置LayoutParams相关参数
wmParams = new
WindowManager.LayoutParams();
// 设置window type
wmParams.type =
LayoutParams.TYPE_PHONE;
// 设置图片格式,效果为背景透明
wmParams.format =
PixelFormat.RGBA_8888;
// 设置Window flag参数
wmParams.flags =
LayoutParams.FLAG_NOT_TOUCH_MODAL
|
LayoutParams.FLAG_NOT_FOCUSABLE;
// 设置x、y初始值
wmParams.x = 0;
wmParams.y = 0;
// 设置窗口长宽数据
wmParams.width = 50;
wmParams.height = 50;
// 创建左右按钮
createLeftButtonView();
createRightButtonView();
}
private void
createLeftButtonView() {
btnLeft = new
ImageView(this);
btnLeft.setImageResource(R.drawable.ic_launcher);
btnLeft.setAlpha(0);
btnLeft.setOnClickListener(new View.OnClickListener() {
public void onClick(View
arg0) {
// 上一个图像
viewFlipper
.setInAnimation(ButtonDrag.this, R.anim.push_left_in);
viewFlipper.setOutAnimation(ButtonDrag.this,
R.anim.push_left_out);
viewFlipper.showPrevious();
}
});
// 调整窗口
wmParams.gravity =
Gravity.LEFT | Gravity.CENTER_VERTICAL;
// 显示图像
wm.addView(btnLeft,
wmParams);
}
private void
createRightButtonView() {
btnRight = new
ImageView(this);
btnRight.setImageResource(R.drawable.ic_launcher);
btnRight.setAlpha(0);
btnRight.setOnClickListener(new View.OnClickListener() {
public void onClick(View
arg0) {
// 下一个图像
viewFlipper.setInAnimation(ButtonDrag.this,
R.anim.push_right_in);
viewFlipper.setOutAnimation(ButtonDrag.this,
R.anim.push_right_out);
viewFlipper.showNext();
}
});
// 调整窗口
wmParams.gravity =
Gravity.RIGHT | Gravity.CENTER_VERTICAL;
// 显示图像
wm.addView(btnRight,
wmParams);
}
private Handler mHandler
= new Handler() {
public void
handleMessage(Message msg) {
if (msg.what == 1
&& mAlpha < 255)
{
// 通过设置不透明度设置按钮的渐显效果
mAlpha += 50;
if (mAlpha
> 255)
mAlpha = 255;
btnLeft.setAlpha(mAlpha);
btnLeft.invalidate();
btnRight.setAlpha(mAlpha);
btnRight.invalidate();
if (!isHide
&& mAlpha < 255)
mHandler.sendEmptyMessageDelayed(1, 100);
} else if (msg.what == 0
&& mAlpha > 0) {
mAlpha -= 10;
if (mAlpha
< 0)
mAlpha = 0;
btnLeft.setAlpha(mAlpha);
btnLeft.invalidate();
btnRight.setAlpha(mAlpha);
btnRight.invalidate();
if (isHide
&& mAlpha > 0)
mHandler.sendEmptyMessageDelayed(0, 800);
}
}
};
private void
showImageButtonView() {
isHide = false;
mHandler.sendEmptyMessage(1);
}
private void
hideImageButtonView() {
new Thread() {
public void run() {
try {
Thread.sleep(1500);
isHide = true;
mHandler.sendEmptyMessage(0);
} catch (Exception e)
{
;
}
}
}.start();
}
@Override
public boolean
onTouchEvent(MotionEvent event) {
switch
(event.getAction()) {
case
MotionEvent.ACTION_MOVE:
case
MotionEvent.ACTION_DOWN:
showImageButtonView();
break;
case
MotionEvent.ACTION_UP:
hideImageButtonView();
break;
}
return true;
}
@Override
public void onDestroy()
{
super.onDestroy();
//
在程序退出(Activity销毁)时销毁窗口
wm.removeView(btnLeft);
wm.removeView(btnRight);
}
}