android小人,Android 仿360桌面小人

该博客介绍了如何在Android中创建一个自定义的悬浮窗`FloatsWindowView`,用于显示动画小人。悬浮窗能够处理用户的触摸事件,包括点击和滑动。当用户点击小人时,会触发特定的逻辑,如启动新的Activity。同时,通过`OnPreDrawListener`监听布局预绘制,实现动画的启动。在Activity中添加这个自定义视图,可以轻松地管理和控制悬浮窗的行为。
摘要由CSDN通过智能技术生成

首先自定义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);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值