浮动窗口成效

浮动窗口效果
import com.yfz.view.MyTextView;

import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;


/**
 * 浮动窗口
 * 
 * @author Administrator
 * 
 */
public class TopFrame extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button button = (Button) findViewById(R.id.bt);

		button.setOnClickListener(onclick);
	}

	private MyTextView tv = null;

	OnClickListener onclick = new OnClickListener() {

		@Override
		public void onClick(View v) {
			if (tv != null && tv.isShown()) {
				WindowManager wm = (WindowManager) getApplicationContext()
						.getSystemService(TopFrame.this.WINDOW_SERVICE);
				wm.removeView(tv);
			}

			show();

		}
	};

	Button btn1 = null;
	Button btn2 = null;

	private void show() {
		Rect frame = new Rect();
		// 这一句是关键,让其在top 层显示
		getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
		MyTextView.TOOL_BAR_HIGH = frame.top;

		WindowManager wm = (WindowManager) getApplicationContext()
				.getSystemService(WINDOW_SERVICE);
		WindowManager.LayoutParams params = MyTextView.params;
		params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
				| WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
		params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
				| LayoutParams.FLAG_NOT_FOCUSABLE;

		params.width = WindowManager.LayoutParams.FILL_PARENT;
		params.height = WindowManager.LayoutParams.WRAP_CONTENT;
		params.alpha = 80;

		params.gravity = Gravity.LEFT | Gravity.TOP;
		// 以屏幕左上角为原点,设置x、y初始值ֵ
		params.x = 0;
		params.y = 0;

		tv = new MyTextView(TopFrame.this);
		wm.addView(tv, params);

	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		WindowManager wm = (WindowManager) getApplicationContext()
				.getSystemService(WINDOW_SERVICE);

		 if(tv != null && tv.isShown()){
		 wm.removeView(tv);
		 }

		super.onDestroy();
	}

}

 自定义textView

public class MyTextView extends TextView {
	private final String TAG = MyTextView.class.getSimpleName();
	
	public static int TOOL_BAR_HIGH = 0;
	public static WindowManager.LayoutParams params = new WindowManager.LayoutParams(); 
	private float startX;
	private float startY;
	private float x;
	private float y;
	
	private String text;
	
	WindowManager wm = (WindowManager)getContext().getApplicationContext().getSystemService(getContext().WINDOW_SERVICE);
 
	public MyTextView(Context context) {
		super(context);
		text = "世上只有妈妈好,有妈的孩子像块宝";
		this.setBackgroundColor(Color.argb(90, 150, 150, 150));
		handler = new Handler();
		handler.post(update);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		//触摸点相对于屏幕左上角坐标
		x = event.getRawX();   
	    y = event.getRawY() - TOOL_BAR_HIGH;
	    Log.d(TAG, "------X: "+ x +"------Y:" + y);
	    
	    switch(event.getAction()) {
	    	case MotionEvent.ACTION_DOWN:
	    		startX = event.getX();
	    		startY = event.getY();
	    		break;
	    	case MotionEvent.ACTION_MOVE:
	    		updatePosition();
	    		break;
	    	case MotionEvent.ACTION_UP:
	    		updatePosition();
	    		startX = startY = 0;
	    		break;
	    }
	    
		return true;
	}
	//这儿使得有颜色变化的字体
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		float1 += 0.001f;
		float2 += 0.001f;	
		
		if(float2 > 1.0){
			float1 = 0.0f;
			float2 = 0.01f;
		}
		this.setText("");
		float len = this.getTextSize() * text.length();
		Shader shader = new LinearGradient(0, 0, len, 0, 
				new int[] { Color.YELLOW, Color.RED },  new float[]{float1, float2},
				TileMode.CLAMP);
		Paint p = new Paint();
		p.setShader(shader);
		p.setTypeface(Typeface.DEFAULT_BOLD);
		canvas.drawText(text, 0, 10, p);
			
	}
	
	private Runnable update = new Runnable() {
        public void run() {
        	MyTextView.this.update();
        	handler.postDelayed(update, 5);
        }
    };
	
	private void update(){
		postInvalidate();
	}
	
	private float float1 = 0.0f;
	private float float2 = 0.01f;
	
	private Handler handler;	

	//更新浮动窗口位置参数
	 private void updatePosition(){
		 // View的当前位置
		 params.x = (int)( x - startX);
		 params.y = (int) (y - startY);
		 wm.updateViewLayout(this, params);
	 }
}