Android 仿360桌面小人

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

}

  

时间: 2024-10-26 19:42:12

Android 仿360桌面小人的相关文章

Android仿360手机卫士悬浮窗效果

请看下图:                         首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. 先谈一下基本的实现原理,这种桌面悬浮窗的效果很类似与Widget,但是它比Widget要灵活的多.主要是通过WindowManager这个类来实现的,调用这个类的addView方法用于添加一个悬浮窗,updateViewLayout方法用于更新悬浮窗的参数,removeView用于移除

Android仿360手机卫士波浪球进度的实现

思路: 1. 首先用clipPath裁剪园区域, 2.将Bitmap不断绘制到Canvas上,再用偏移量来控制移动的速度,从而形成波浪动态效果. activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_widt

分享一个android仿ios桌面卸载的图标抖动动画

直接上代码,如有更好的,还请指教 <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?> <rotate android:toDegrees="2" android:repeatMode="reverse" android:repeatCount="infinite" andr

Android -- 桌面悬浮,仿360

实现原理                                                                               这种桌面悬浮窗的效果很类似与Widget,但是它比Widget要灵活的多.主要是通过WindowManager这个类来实现的,调用这个类的addView方法用于添加一个悬浮窗,updateViewLayout方法用于更新悬浮窗的参数,removeView用于移除悬浮窗.其中悬浮窗的参数有必要详细说明一下. WindowManager

Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8689140 大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多高手喜欢把自己的经验写在网上,供大家来学习,我也是从中受惠了很多,在此我深表感谢.可是我发现我却从来没有将自己平时的一些心得拿出来与大家分享,共同学习,太没有奉献精神了.

android 浮动窗口学习笔记及个人理解(仿360手机助手)

非常感谢原文作者 http://blog.csdn.net/guolin_blog/article/details/8689140 经自己理解 程序运行界面如下图: 1.程序入口界面 2.小浮动窗口 3.大浮动窗口 由上图可看出,可以看出我们基本需要: 1.一个主Activity 2.小浮动窗口view界面 3.大浮动窗口view界面 对于浮动窗口的管理我们还需要 4.一个Service(在后台监控管理浮动窗口的状态) 5.窗口管理类(创建/消除浮动窗口) 代码: package com.ww.

Android静默安装实现方案,仿360手机助手秒装和智能安装功能

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/47803149 之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢?所谓的静默安装,就是不用弹出系统的安装界面,在不影响用户任何操作的情况下不知不觉地将程序装好.虽说这种方式看上去不打搅用户,但是却存在着一个问题,因为Android系统会在安装界面当中把程序所声明的权限展示给用户看,用户来评估一下这些权限然后决定是否要安装该程序,但如果使用了静默安装的方式,也就没

高仿360手机卫士——Android源码

高仿360手机卫士 高仿360手机卫士界面android源码,左右滑动效果,超炫. 下载地址:http://www.devstore.cn/code/info/1173.html 运行截图:    热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较不错的新闻客户端 版权声明:本文为博主原创文章,未经博主允许不得转载.

仿360加速球。(实现内存释放)

FloatCircleView的实现自定义view 创建WindowManager窗体管理类管理悬浮小球和底部大窗体 MyProgreeView手机底部窗体中小球的实现 FloatMenuView的实现 MyFloatService MainActivity的实现 现在手机上的悬浮窗应用越来越多,对用户来说,最常见的悬浮窗应用就是安全软件的悬浮小控件,拿360卫士来说,当开启悬浮窗时,它是一个小球,小球可以拖动,当点击小球出现大窗体控件,可以进行进一步的操作如:释放手机内存等等.于是借着慕课网的