android activity悬浮且透明

这个功能实现了一个自定义的textvew悬浮在所有的ui控件之上 ,且透明, 只是这种透明效果不是很好,

如下图所示:

这是天天动听的效果:

 

它的这个透明效果很好,不知道哪位大侠指点一下,先谢谢了

上代码:

下载

TopFrame.java

package com.iaiai;

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

import com.iaiai.view.MyTextView;

/**
 *
 * <p>
 * Title: TopFrame.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-9-28
 * </p>
 *
 * @author 丸子
 * @version 0.0.1
 */
public class TopFrame extends Activity {
 
 @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();
   
  }
 };
 
 
 private void show(){
  Rect frame = new Rect(); 
  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.format = PixelFormat.RGBA_8888;
  params.gravity=Gravity.LEFT|Gravity.TOP;
     //以屏幕左上角为原点,设置x、y初始值
  params.x = 20;
  params.y = 30;
        
  tv = new MyTextView(TopFrame.this);
//  tv = (MyTextView) findViewById(R.id.mytextview);
  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();
 }
 
 
 
}

 

MyTextView.java

package com.iaiai.view;

import java.text.AttributedCharacterIterator.Attribute;

import com.iaiai.R;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.Shader.TileMode;
import android.graphics.Typeface;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.TextView;

/**
 *
 * <p>
 * Title: MyTextView.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-9-28
 * </p>
 *
 * @author 丸子
 * @version 0.0.1
 */
public class MyTextView extends TextView {
 public MyTextView(Context context, AttributeSet attrs) {
  super(context, attrs);
  // TODO Auto-generated constructor stub
 }

 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.setWidth(200);
  this.setHeight(100);
  // this.setBackgroundColor(Color.YELLOW);
  // this.setBackgroundColor(Color.argb(90, 150, 150, 150));
  // this.setBackgroundColor(Color.argb(0, 0, 255, 0)); //背景透明度
  // this.setBackgroundColor(0x80000000); //背景透明度
  // this.setBackgroundColor(#0000); //背景透明度
  // this.setTypeface(tf, style);
  this.setBackgroundColor(R.color.transparent);
  // this.getBackground().setAlpha(180);
  // this.setBackgroundColor(color).setAlpha(180);

  // 下面这句话在此并不是控制歌词大小,仅仅是为了控制背景大小,如果不设置的话,Paint字体大时会被遮挡
  this.setTextSize(20f);
  handler = new Handler();
  // handler.post(update);
 }

 //
 // public MyTextView(Context context,Attribute attribute) {
 // // TODO Auto-generated constructor stub
 // super(context, attribute);
 // }

 @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.BLUE }, new float[] { float1, float2 },
    TileMode.CLAMP);
  Paint p = new Paint();
  p.setShader(shader);
  // 下面这句才控制歌词大小
  p.setTextSize(26f);
  // p.setTypeface(Typeface.DEFAULT_BOLD);
  canvas.drawText(text, 10, 40, 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);
 }
}

 

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#fffffb"
     >

    <Button
        android:id="@+id/bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="点我试试" />

    <com.iaiai.view.MyTextView
        android:id="@+id/mytextview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
         />

</LinearLayout>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值