这个功能实现了一个自定义的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>