悬浮按钮

http://www.oschina.net/question/157182_37944

 

http://www.oschina.net/code/snippet_157182_8608

首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的WindowManager,WindowManager.LayoutParams。那么在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

然后,我们要对WindowManager,WindowManager.LayoutParams的相关属性进行下设置:

private WindowManager wm=null;
private WindowManager.LayoutParams wmParams=null;

private void initFloatView(){
    //获取WindowManager
    wm=(WindowManager)getApplicationContext().getSystemService("window");
    //设置LayoutParams(全局变量)相关参数
     wmParams = new WindowManager.LayoutParams();
    	
    wmParams.type=LayoutParams.TYPE_PHONE;   //设置window type
    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;
}

通过WindowManager的addView方法创建的View可以实现悬浮窗口效果!因此,我们需要为屏幕创建2个悬浮按钮了。

    /**
    * 创建左边悬浮按钮
    */
    private void createLeftFloatView(){
    	leftbtn=new ImageView(this);
    	leftbtn.setImageResource(R.drawable.prev);
    	leftbtn.setAlpha(0);
    	leftbtn.setOnClickListener(new View.OnClickListener() {	
		public void onClick(View arg0) {
			//上一篇
		}
	});
    	//调整悬浮窗口
        wmParams.gravity=Gravity.LEFT|Gravity.CENTER_VERTICAL;
        //显示myFloatView图像
        wm.addView(leftbtn, wmParams);
    }
    /**
    * 创建右边悬浮按钮
    */
    private void createRightFloatView(){
    	rightbtn=new ImageView(this);
    	rightbtn.setImageResource(R.drawable.next);
    	rightbtn.setAlpha(0);
    	rightbtn.setOnClickListener(new View.OnClickListener() {	
		public void onClick(View arg0) {
			//下一篇
		}
	});
    	//调整悬浮窗口
        wmParams.gravity=Gravity.RIGHT|Gravity.CENTER_VERTICAL;
        //显示myFloatView图像
        wm.addView(rightbtn, wmParams);
    }

我把图片的Alpha值设置为0,是因为不想让悬浮按钮一开始就展现出来;我想通过对屏幕的触摸来实现悬浮按钮的渐变显示和渐变隐藏。那么我们还要对图片的渐变效果进行下处理:

    // ImageView的alpha值   
    private int mAlpha = 0;
    private boolean isHide;
    /**
     * 图片渐变显示处理
     */
    private Handler mHandler = new Handler()
    {
	public void handleMessage(Message msg) {
	    if(msg.what==1 && mAlpha<255){   
		//System.out.println("---"+mAlpha);					
		mAlpha += 50;
		if(mAlpha>255)
		    mAlpha=255;
	         leftbtn.setAlpha(mAlpha);
	         leftbtn.invalidate();
	         rightbtn.setAlpha(mAlpha);
	         rightbtn.invalidate();
		if(!isHide && mAlpha<255)
		    mHandler.sendEmptyMessageDelayed(1, 100);
	    }else if(msg.what==0 && mAlpha>0){
		//System.out.println("---"+mAlpha);
		mAlpha -= 10;
		if(mAlpha<0)
		    mAlpha=0;
		leftbtn.setAlpha(mAlpha);
		leftbtn.invalidate();
		rightbtn.setAlpha(mAlpha);
		rightbtn.invalidate();
		if(isHide && mAlpha>0)
		    mHandler.sendEmptyMessageDelayed(0, 100);
	    }			
	}
    };

 

我们再用2个方法分别来控制悬浮按钮的显示、隐藏:

    private void showFloatView(){
    	isHide = false;
    	mHandler.sendEmptyMessage(1);
    }
    
    private void hideFloatView(){
	new Thread(){
	    public void run() {
		try {
	               Thread.sleep(1500);
	               isHide = true;
	               mHandler.sendEmptyMessage(0);
	         } catch (Exception e) {
	                ;
	         }
	    }
	}.start();
    }

 

这里为了不让悬浮按钮显示后,马上就开始隐藏。我使用了一个线程,先暂停1.5秒钟,再开始渐变隐藏。
接下来,我要重写Activity的onTouchEvent触屏事件,代码如下:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
    	switch (event.getAction()) {
    	    case MotionEvent.ACTION_MOVE:
	    case MotionEvent.ACTION_DOWN:
		//System.out.println("========ACTION_DOWN");
		showFloatView();			
		break;
	    case MotionEvent.ACTION_UP:
		//System.out.println("========ACTION_UP");
		hideFloatView();				
		break;
	}
	return true;
    }

最后,要在Activity销毁时销毁悬浮按钮,不然悬浮按钮会一直悬浮在那。因此,我们要再重写Activity的onDestroy()方法,并调用WindowManager的removeView()方法来移除悬浮按钮。

    @Override
    public void onDestroy(){
    	super.onDestroy();
    	//在程序退出(Activity销毁)时销毁悬浮窗口
    	wm.removeView(leftbtn);
    	wm.removeView(rightbtn);
    }
posted @ 2013-07-16 15:18  kobe8  Views(4056)  Comments(0Edit  收藏  举报