(2011-05-29 12:17:41) 转载
标签:

android

桌面浮动小窗口

可移动

分类: 手机

早上醒来在床上拿手机开了“天天动听”边听歌边玩,突然感觉“天天动听”的后台做得真的很酷,可以在桌面用手指随意移动它的窗口,还可以轻触点击它回到程 序主窗口!然后想起前几天看到的Android浮动窗口实现,不知道这个“点击返回主界面”能不能也在Android实现呢!!!

想到就动手,马上爬起床。。。。

经过多次调试。。。

然后就有了下面的代码!!!

嘿嘿~~~~成功啦!!!Android手机可返回主界面的可移动浮动小窗口

我在别人的代码上修改还有增加了点功能

程序首先进入主界面,然后按手机的“home”键退出主界面;然后创建小窗口,可以用手指移动窗口,长按小窗口1500毫秒会销毁小窗口并返回程序主界面,实现了“点击返回主界面”的功能!

给几张截图^__^

Android手机可返回主界面的可移动浮动小窗口_第1张图片


Android手机可返回主界面的可移动浮动小窗口_第2张图片

Android手机可返回主界面的可移动浮动小窗口_第3张图片

有三个类分三个文件存放:

第一个是:MyFloatViewActivity.java

-----------------------------------------------------------------------------

package fazai.wensi;


import net.xsmile.fv.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.WindowManager;

public class MyFloatViewActivity extends Activity {

WindowManager wm=null;
WindowManager.LayoutParams wmParams=null;
MyFloatView myFV=null;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public void onStop(){
super.onStop();
createView();
}
@Override
public void onRestart(){
super.onRestart();
wm.removeView(myFV);
}

private void createView(){
myFV=new MyFloatView(getApplicationContext(),this);
myFV.setImageResource(R.drawable.icon);
//获取WindowManager
wm=(WindowManager)getApplicationContext().getSystemService("window");
//设置LayoutParams(全局变量)相关参数
wmParams = ((MyApplication)getApplication()).getMywmParams();
wmParams.type=2002;
wmParams.flags|=8;

wmParams.gravity=Gravity.LEFT|Gravity.TOP; //调整悬浮窗口至左上角
//以屏幕左上角为原点,设置x、y初始值
wmParams.x=0;
wmParams.y=0;

//设置悬浮窗口长宽数据
wmParams.width=50;
wmParams.height=50;

//显示myFloatView图像
wm.addView(myFV, wmParams);

}
@Override
public void onDestroy(){
super.onDestroy();
//在程序退出(Activity销毁)时销毁悬浮窗口
wm.removeView(myFV);
}
}

--------------------------------------------------------------------------------------

第二个是:MyApplication.java

--------------------------------------------------------------------------------------

package fazai.wensi;

import android.app.Application;
import android.view.WindowManager;

public class MyApplication extends Application {


private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();


public WindowManager.LayoutParams getMywmParams(){
return wmParams;
}
}

--------------------------------------------------------------------------------------

第三个是:MyFloatView.java

--------------------------------------------------------------------------------------

package fazai.wensi;

import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.ImageView;

public class MyFloatView extends ImageView {

private float mTouchStartX;
private float mTouchStartY;
private float x;
private float y;
public Timer timer;
int state;
MyFloatViewActivity my;//引用Activity


//对窗口的引用,为下面的窗口移动提供引用
private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService("window");
private WindowManager.LayoutParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams();

public MyFloatView(Context context,MyFloatViewActivity my) {
super(context);
this.my=my;//传入引用
// TODO Auto-generated constructor stub
}

@Override
public boolean onTouchEvent(MotionEvent event) {


//获取相对屏幕的坐标,即以屏幕左上角为原点
x = event.getRawX();
y = event.getRawY()-25; //25是系统状态栏的高度
Log.i("currP", "currX"+x+"====currY"+y);//调试信息
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
state = MotionEvent.ACTION_DOWN;
panTime();
//获取相对View的坐标,即以此View左上角为原点
mTouchStartX = event.getX();
mTouchStartY = event.getY();
Log.i("startP", "startX"+mTouchStartX+"====startY"+mTouchStartY);//调试信息

break;
case MotionEvent.ACTION_MOVE:
state =MotionEvent.ACTION_MOVE;
updateViewPosition();
break;

case MotionEvent.ACTION_UP:
state = MotionEvent.ACTION_UP;
updateViewPosition();
mTouchStartX=mTouchStartY=0;
break;
}
return true;
}

private void panTime(){
final Handler handler=new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case 1:
Log.i("11111111111","jjjjjjjjjjjjjjjjjjjj");//调试信息
timer.cancel(); //取消定时
Intent intent = my.getIntent(); //为了重启Activity返回Intent
my.finish(); //关闭Activity
my.startActivity(intent); //重启Activity
break;
case 2:
Log.i("22222222222","22222222222222222222");//调试信息
timer.cancel();
break;
}
super.handleMessage(msg);
}
};
TimerTask task=new TimerTask(){
public void run(){
Message message=new Message();
if(state == MotionEvent.ACTION_DOWN){
message.what=1;
}else {
message.what=2;
}
handler.sendMessage(message);
}
};
timer=new Timer();
timer.schedule(task,1500); //定时
}


private void updateViewPosition(){
//更新浮动窗口位置参数
wmParams.x=(int)( x-mTouchStartX);
wmParams.y=(int) (y-mTouchStartY);
wm.updateViewLayout(this, wmParams);

}

}
-------------------------------------------------------------------------------------------------

其实还可以实现在小窗口内提示信息的,就像“QQ”“飞信”来信息会闪烁图片那样,只要在后台开个线程,然后每隔一段时间更换小窗口的图片就可以

更多相关文章

  1. Android UI设计(引导界面):ViewPager之基本用法
  2. 谷歌Android手机应用开发环境的搭建
  3. Android应用程序窗口View的创建过程
  4. 如何把android项目部署到真实手机上测试
  5. 如何看Android刺激国产手机的洗牌?
  6. android 根据滑动隐藏或显示导航 类似手机QQ好友个人信息
  7. Android调用系统自定义设置界面
  8. Android 登陆界面及记住用户名密码
  9. Android:设置手机返回键是否可返回

随机推荐

  1. Ubuntu 14.04 LTS 安装 文泉驿微米黑 字
  2. WebView项目中PhoneGap插件使用细节start
  3. Android多媒体开发【10】-- android中Ope
  4. 用shape美化控件
  5. Android开发初步之Activity与Intent
  6. Android 最火快速开发框架AndroidAnnotat
  7. android应用安全――代码安全(android代码
  8. android之绕Y轴旋转
  9. android中handler案例
  10. Android(安卓)Binder Mechanism (2) --