帶磁性的懸浮窗體

轉載請註明出處,本文來自 http://blog.csdn.net/manymore13

帶磁性的懸浮窗體,類似於360綠色小人

主要實現的是:

1.懸浮所有窗體之上

2.有吸引力,吸附於屏幕邊上

3.有點擊效果

下面我就實現上面三點,簡單封裝了個FloatView 

先看下本次Demo的效果圖,然後再看代碼,

效果圖:


FloatView代碼如下

package com.manymore13.flowwindowdemo;

import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.ImageView;

/**
 * @author manymore13  
 * @Blog <a href="http://blog.csdn.net/manymore13">http://blog.csdn.net/manymore13</a>
 * @version 1.0
 */
public class FloatView extends ImageView{
	
	private float mTouchX;
	private float mTouchY;
	private float x;
	private float y;
	private int startX;
	private int startY;
	private Context c;
	private int imgId = R.drawable.ic_launcher;
	private int controlledSpace = 20; 
	private int screenWidth;
	boolean isShow = false;
	private OnClickListener mClickListener;
	
	private WindowManager windowManager ;
	
	private WindowManager.LayoutParams windowManagerParams = new WindowManager.LayoutParams();

	public FloatView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	public FloatView(Context c)
	{
		super(c);
		initView(c);
	}
	// 初始化窗體
	public void initView(Context c)
	{
		windowManager = (WindowManager) c.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
		screenWidth = windowManager.getDefaultDisplay().getWidth();
		this.setImageResource(imgId);
		windowManagerParams.type = LayoutParams.TYPE_PHONE;
		windowManagerParams.format = PixelFormat.RGBA_8888;	// 背景透明
		windowManagerParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
				| LayoutParams.FLAG_NOT_FOCUSABLE;
		// 調整懸浮窗口至左上角,便於調整座標
		windowManagerParams.gravity = Gravity.LEFT | Gravity.TOP; 
		// 以屏幕左上角爲原點,設置x、y初始值
		windowManagerParams.x = 0;
		windowManagerParams.y = 200;
		// 設置懸浮窗口長寬數據
		windowManagerParams.width = LayoutParams.WRAP_CONTENT;
		windowManagerParams.height = LayoutParams.WRAP_CONTENT;
		
	}
	
	public void setImgResource(int id)
	{
		imgId = id;
	}
		
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		
		x = event.getRawX();
		y = event.getRawY();
				
		switch(event.getAction())
		{
			case MotionEvent.ACTION_DOWN:
			{
				mTouchX = event.getX();
				mTouchY = event.getY();
				startX = (int) event.getRawX();
				startY = (int) event.getRawY();
				break;
				
			}
			case MotionEvent.ACTION_MOVE:
			{
				updateViewPosition();
				break;
			}
			case MotionEvent.ACTION_UP:
			{
			
				if(Math.abs(x - startX) < controlledSpace && Math.abs(y - startY) < controlledSpace)
				{
					if(mClickListener != null)
					{
						mClickListener.onClick(this);
					}
				}
				Log.i("tag", "x="+x+" startX+"+startX+" y="+y+" startY="+startY);
				if(x <= screenWidth/2)
				{
					x = 0;
				}else{
					x = screenWidth;
				}
				
				updateViewPosition();
							
				break;
			}
		}
			
		return super.onTouchEvent(event);
	}
	
	// 隱藏該窗體
	public void hide()
	{
		if(isShow)
		{
			windowManager.removeView(this);
			isShow = false;
		}
				
	}
	
	// 顯示該窗體
	public void show()
	{
		if(isShow == false)
		{
			windowManager.addView(this, windowManagerParams);
			isShow = true;
		}
		
	}
	
	@Override
    public void setOnClickListener(OnClickListener l) {
         this.mClickListener = l;
    }
	
    private void updateViewPosition() {
         // 更新浮動窗口位置參數
	     windowManagerParams.x = (int) (x - mTouchX);
	     windowManagerParams.y = (int) (y - mTouchY);
	     windowManager.updateViewLayout(this, windowManagerParams); // 刷新顯示
    }
}
</pre><p><a target=_blank target="_blank" href="http://download.csdn.net/detail/manymore13/5059735"><strong><span style="font-size:14px">源碼</span></strong></a></p><span style="font-family:Comic Sans MS; font-size:14px">如果需要用上面的類可以這樣做</span><p></p><p><span style="font-family:Comic Sans MS; font-size:14px">floatView = new FloatView(this); // 創建窗體</span></p><p><span style="font-family:Comic Sans MS; font-size:14px">floatView.setOnClickListener(this); // 設置事件,你需要實現FloatView裏的onclick接口</span></p><p><span style="font-family:Comic Sans MS; font-size:14px">floatView.show();  // 顯示該窗體</span></p><p><span style="font-family:Comic Sans MS; font-size:14px">floatView.hide();  // 隱藏窗體</span></p><p><strong><span style="font-size:18px; color:#ff0000">PS </span></strong> <span style="font-family:Comic Sans MS; color:#ff0000">不要忘記在manifest里加上權限  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /></span></p><p><span style="font-family: 'Comic Sans MS';">----------------------------------------------------------------------------------分割線---------------------------------------------------------------------------</span></p><p><span style="font-family: 'Comic Sans MS';">上面有個bug 就是點擊的時候view下移</span></p><p><span style="font-family: 'Comic Sans MS';"></span><pre name="code" class="java">public int getStatusBarHeight() {
        int titleBarHeight = 0;
        Rect frame = new Rect();
        mAct.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        titleBarHeight = frame.top;
        if (titleBarHeight == 0) {
            int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
            if (resourceId > 0) {
                titleBarHeight = getResources().getDimensionPixelSize(resourceId);
            }
        }
        return titleBarHeight;
    }



發佈了61 篇原創文章 · 獲贊 380 · 訪問量 58萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章