懸浮按鈕


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);
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM