首先自定义FloatsWindowView,用于显示动画小人。
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.view.WindowManager;
import android.widget.Toast; @SuppressLint("ClickableViewAccessibility")
public class FloatsWindowView extends View { private Context mContext = null;
private WindowManager mWindowMgr = null;
private WindowManager.LayoutParams mWindowMgrParams = null;
private AnimationDrawable mAnimationDrawable = null; private int iPosX = 0;
private int iPosY = 0;
private int iLastPosX = 0;
private int iLastPosY = 0;
private boolean bMoved = false; public FloatsWindowView(Context context) {
this(context, null, 0);
} public FloatsWindowView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} @SuppressWarnings("deprecation")
public FloatsWindowView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); mContext = context;
mWindowMgr = (WindowManager) getContext().getApplicationContext()
.getSystemService("window");
mWindowMgrParams = new WindowManager.LayoutParams();
initParams(); mAnimationDrawable = new AnimationDrawable();
for (int i = 0; i < 4; i++) {
int id = getResources().getIdentifier("a" + i, "drawable",
mContext.getPackageName());
mAnimationDrawable.addFrame(getResources().getDrawable(id), 100);
}
mAnimationDrawable.setOneShot(false);
this.setBackgroundDrawable(mAnimationDrawable); OnPreDrawListener listener = new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
mAnimationDrawable.start();
return true;
}
};
this.getViewTreeObserver().addOnPreDrawListener(listener);
} private void initParams() {
DisplayMetrics dm = getResources().getDisplayMetrics();
mWindowMgrParams.x = dm.widthPixels - 136;
mWindowMgrParams.y = 300;
mWindowMgrParams.width = 136;
mWindowMgrParams.height = 136;
} @Override
public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
iPosX = (int) event.getX();
iPosY = (int) event.getY();
bMoved = false;
break; case MotionEvent.ACTION_MOVE:
bMoved = true;
iLastPosX = (int) event.getX();
iLastPosY = (int) event.getY();
updatePostion(iLastPosX - iPosX, iLastPosY - iPosY);
break; case MotionEvent.ACTION_UP:
if (!bMoved) {
Intent it = new Intent(mContext, MainActivity.class);
mContext.startActivity(it);
}
break; default:
break;
} if (event.getAction() == MotionEvent.ACTION_MOVE) {
getParent().requestDisallowInterceptTouchEvent(true);
} if (event.getAction() == MotionEvent.ACTION_UP) {
if ((iPosX == iLastPosX) && (iPosY == iLastPosY)) {
singleClick();
return true;
}
}
return true;
} private void updatePostion(int x, int y) {
mWindowMgrParams.type = 2003;
mWindowMgrParams.format = 1;
mWindowMgrParams.flags = 40;
mWindowMgrParams.gravity = Gravity.LEFT | Gravity.TOP;
mWindowMgrParams.x += x;
mWindowMgrParams.y += y;
mWindowMgr.updateViewLayout(this, mWindowMgrParams);
} public void singleClick() {
Toast.makeText(mContext, "点击了阿狸,哇咔咔咔", Toast.LENGTH_SHORT).show();
}
}
然后在Activity中添加自定义小人,即可,可以处理小人的点击逻辑,滑动逻辑。
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.WindowManager;
import android.app.Activity;
import android.content.Context; public class MainActivity extends Activity { private static WindowManager mWindowMgr = null;
private WindowManager.LayoutParams mWindowMgrParams = null;
private static FloatsWindowView mFloatsWindowView = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
protected void onStop() {
super.onStop();
} @Override
public void onWindowFocusChanged(boolean hasFocus) {
getWindowLayout();
} private void initParams() {
DisplayMetrics dm = getResources().getDisplayMetrics();
mWindowMgrParams.x = dm.widthPixels - 136;
mWindowMgrParams.y = 300;
mWindowMgrParams.width = 136;
mWindowMgrParams.height = 136;
} private void getWindowLayout() {
if (mFloatsWindowView == null) {
mWindowMgr = (WindowManager) getBaseContext().getSystemService(
Context.WINDOW_SERVICE);
mWindowMgrParams = new WindowManager.LayoutParams(); /*
* 2003 在指悬浮在所有界面之上 (4.0+系统中,在下拉菜单下面,而在2.3中,在上拉菜单之上)
*/
mWindowMgrParams.type = 2003;
mWindowMgrParams.format = 1; /*
* 代码实际是wmParams.flags |= FLAG_NOT_FOCUSABLE;
* 40的由来是wmParams的默认属性(32)+ FLAG_NOT_FOCUSABLE(8)
*/
mWindowMgrParams.flags = 40;
mWindowMgrParams.gravity = Gravity.LEFT | Gravity.TOP;
initParams(); mFloatsWindowView = new FloatsWindowView(this);
mWindowMgr.addView(mFloatsWindowView, mWindowMgrParams);
}
} }