Android手机可返回主界面的可移动浮动小窗口
???我在别人的代码上修改还有增加了点功能
???程序首先进入主界面,然后按手机的“home”键退出主界面;然后创建小窗口,可以用手指移动窗口,长按小窗口1500毫秒会销毁小窗口并返回程序主界面,实现了“点击返回主界面”的功能!
???
给几张截图^__^
?
有三个类分三个文件存放:
?
?
第一个是: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 voidonCreate(Bundle savedInstanceState) {
???????super.onCreate(savedInstanceState);
???????setContentView(R.layout.main);
??? }
???@Override
??? public voidonStop(){
????super.onStop();
????createView();
??? }
???@Override
??? public voidonRestart(){
????super.onRestart();
????wm.removeView(myFV);
??? }
???
??? private voidcreateView(){
????myFV=newMyFloatView(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 voidonDestroy(){
????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=newWindowManager.LayoutParams();
?public WindowManager.LayoutParamsgetMywmParams(){
??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;
??? privatefloat mTouchStartY;
??? privatefloat x;
??? privatefloat y;
??? public Timertimer;
??? intstate;
???MyFloatViewActivity my;//引用Activity
???
???//对窗口的引用,为下面的窗口移动提供引用
??? privateWindowManagerwm=(WindowManager)getContext().getApplicationContext().getSystemService("window");
??? privateWindowManager.LayoutParams wmParams =((MyApplication)getContext().getApplicationContext()).getMywmParams();
?public MyFloatView(Contextcontext,MyFloatViewActivity my) {
??super(context);
??this.my=my;//传入引用
??// TODO Auto-generatedconstructor 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){
????????????????case1:?????????????????
????????????????????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”“飞信”来信息会闪烁图片那样,只要在后台开个线程,然后每隔一段时间更换小窗口的图片就可以