浮动窗口成效
浮动窗口效果
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); } }