Android项目之——Activity悬浮并可拖动
来源:互联网 发布:网络预约出租车驾驶员 编辑:程序博客网 时间:2024/05/20 06:08
天天动听, 这款Android手机上的音乐播放器,相信不少朋友都曾用过。 不知大家是否注意到,天天动听有一个迷你歌词的特效。
什么效果呢? 就是不管你切到什么画面, 歌词永远显示,并且可以拖动。 类型QQ音乐,在电脑上播放时显示的歌词效果。
下面先来看一下效果。
这个歌词是在所有界面之上的。
下面我们将这个效果解剖一下, 我认为主要有三个难点:
1. 歌词悬浮在所有页面之上
2. 歌词可以拖动位置
3. 歌词的播放效果 (颜色覆盖)
对于第一点,首先想到的就是 WindowManager , 这个类可能不少人都用过, 一般用于获取屏幕宽度、高度,那么这次就要利用这个类来让我们的歌词永远置顶。
通过查看API,我们看到,在WindowManager.LayoutParams类中,有好几个属性可以设置View置顶。
引用
1
TYPE_SYSTEM_OVERLAYWindow type: system overlay windows, which need to be displayed on top of everything
else
.
2
TYPE_SYSTEM_ALERTWindow type: system window, such as low power alert.
3
TYPE_PHONEThese windows are normally placed above all applications, but behind the status bar.
1
WindowManager wm = (WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE);
2
WindowManager.LayoutParams params =
new
WindowManager.LayoutParams();
3
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
4
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
5
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
6
TextView tv =
new
TextView(
this
);
7
wm.addView(tv, params);
1
<uses-permission android:name=
"android.permission.SYSTEM_ALERT_WINDOW"
/>
1
params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE;
01
@Override
02
public
boolean
onTouchEvent(MotionEvent event) {
03
//触摸点相对于屏幕左上角坐标
04
x = event.getRawX();
05
y = event.getRawY() - TOOL_BAR_HIGH;
06
Log.d(TAG,
"------X: "
+ x +
"------Y:"
+ y);
07
switch
(event.getAction()) {
08
case
MotionEvent.ACTION_DOWN:
09
startX = event.getX();
10
startY = event.getY();
11
break
;
12
case
MotionEvent.ACTION_MOVE:
13
updatePosition();
14
break
;
15
case
MotionEvent.ACTION_UP:
16
updatePosition();
17
startX = startY =
0
;
18
break
;
19
}
20
return
true
;
21
}
22
//更新浮动窗口位置参数
23
private
void
updatePosition(){
24
// View的当前位置
25
params.x = (
int
)( x - startX);
26
params.y = (
int
) (y - startY);
27
wm.updateViewLayout(
this
, params);
28
}
01
WindowManager wm = (WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE);
02
WindowManager.LayoutParams params = MyTextView.params;
03
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
04
params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE;
05
params.width = WindowManager.LayoutParams.FILL_PARENT;
06
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
07
params.alpha =
80
;
08
params.gravity=Gravity.LEFT|Gravity.TOP;
09
//以屏幕左上角为原点,设置x、y初始值
10
params.x =
0
;
11
params.y =
0
;
12
tv =
new
MyTextView(TopFrame.
this
);
13
wm.addView(tv, params);
1
params.gravity=Gravity.LEFT|Gravity.TOP;
1
params.x =
0
;
2
params.y =
0
;
01
@Override
02
protected
void
onDraw(Canvas canvas) {
03
// TODO Auto-generated method stub
04
super
.onDraw(canvas);
05
float1 +=
0
.001f;
06
float2 +=
0
.001f;
07
if
(float2 >
1.0
){
08
float1 =
0
.0f;
09
float2 =
0
.01f;
10
}
11
this
.setText(
""
);
12
float
len =
this
.getTextSize() * text.length();
13
Shader shader =
new
LinearGradient(
0
,
0
, len,
0
,
14
new
int
[] { Color.YELLOW, Color.RED },
new
float
[]{float1, float2},
15
TileMode.CLAMP);
16
Paint p =
new
Paint();
17
p.setShader(shader);
18
// 下面这句才控制歌词大小
19
p.setTextSize(20f);
20
p.setTypeface(Typeface.DEFAULT_BOLD);
21
//此处x,y坐标也要注意,尤其是y坐标,要与字体大小协调
22
canvas.drawText(text,
0
,
20
, p);
23
}
1
private
Runnable update =
new
Runnable() {
2
public
void
run() {
3
MyTextView.
this
.update();
4
handler.postDelayed(update,
3
);
5
}
6
private
void
update(){
7
postInvalidate();
8
}
- Android项目之——Activity悬浮并可拖动
- Android项目之——Activity悬浮并可拖动
- Android项目之——Activity悬浮并可拖动(访悬浮歌词)
- Android 悬浮Activity并可拖动(访悬浮歌词)
- Android 悬浮Activity并可拖动(访悬浮歌词)
- Android 悬浮Activity并可拖动(访悬浮歌词)
- Android 悬浮Activity并可拖动(访悬浮歌词)
- Android 悬浮Activity并可拖动(访悬浮歌词)
- Android 悬浮Activity并可拖动(访悬浮歌词)
- Android 悬浮Activity并可拖动(访悬浮歌词)
- Activity悬浮并可拖动(访悬浮歌词)
- Android 悬浮并可拖动的实现
- Android 悬浮在Activity内的可拖动View
- Android 可拖动可点击悬浮窗
- Android 可随意拖动的悬浮窗体
- android WindowManager可拖动悬浮按钮
- Android 可拖动的悬浮按钮
- Android开发 自定义悬浮可拖动view
- js 遍历json
- hdu 1058 Humble Numbers
- Oralce的Sql语名性能分析
- ORA-00910: specified length too long for its datatype
- 怎样合理地规划使用电脑硬盘
- Android项目之——Activity悬浮并可拖动
- android高手成长之路--怎样成为编程高手
- linux服务器监控命令
- poj 3368 Frequent values#线段树
- linux 下软键盘的弹出与隐藏
- switch-case语句用法
- the superiority of ARM Cortex-M3
- California Mathmetics-G6-Ch8
- Linux打包命令