項目需要,製作類似360,UC類似遊戲內的懸浮球
1.開始使用的是系統的懸浮,添加系統權限android.permission.SYSTEM_ALERT_WINDOW,獲取windowManager , 設置佈局參數,添加view來實現,
優點:處於系統最上層,一次添加,多個地方使用,簡單快捷,應用退出到後臺還可以顯示在界面上
缺點:不能保證所有手機都系統懸浮球彈出
之前用過採用版本API>18windowManagerParams.type = LayoutParams.TYPE_TOAST(系統不檢查權限)反之採用windowManagerParams.type = LayoutParams.TYPE_PHONE
還是沒有很好的保證系統懸浮球彈出,只能說android手機廠商太多,各家都有自己系統定製難兼容!
2.自定義應用內,懸浮球
思路:
爲了完全彈窗懸浮球,只能定義懸浮球來實現了,之後每個窗體添加下,(寫個基類包含添加該懸浮球功能,其他子類繼承添加就好)
優點:保證所有機器都能彈出懸浮球缺點:在需要添加的每個窗體,中添加,刪除,對改懸浮球,應用退到後臺後不可顯示在前端
下面是自定義懸浮球控件,包括區域檢測點擊,onDraw有點亂,沒整理抱歉,看官將就下哈!
package com.krislq.floating;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.LinearLayout.LayoutParams;
import com.fengcao.okwan.R;
public class CircleFloatView extends View{
public static String TAG = CircleFloatView.class.getCanonicalName();
private float x;
private float y;
private float mStartX;
private float mStartY;
private Context context;
Bitmap bp_logo,bp_gift,bp_account;
boolean logoIsClose=true;//關閉,打開,禮包賬號
Paint pic_Paint,txt_Paint;
Rect rt_logo,rt_gift,rt_account;
int leftpadd=20;
int topadd=10;
private float currentx;
private float currenty;
int screenwidth,screenheigh;
boolean isFirstshow=true;
public CircleFloatView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public CircleFloatView(Context context) {
super(context);
this.context = context;
//獲取屏幕寬高
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
screenwidth = manager.getDefaultDisplay().getWidth();
screenheigh = manager.getDefaultDisplay().getHeight();
pic_Paint=new Paint();
pic_Paint.setAntiAlias(true);
txt_Paint=new Paint();
txt_Paint.setTextSize(26);
txt_Paint.setAntiAlias(true);
txt_Paint.setColor(Color.BLACK);
bp_logo=BitmapFactory.decodeResource(getResources(),R.drawable.float_icon);
bp_gift=BitmapFactory.decodeResource(getResources(),R.drawable.gift_icon);
bp_account=BitmapFactory.decodeResource(getResources(),R.drawable.account_icon);
rt_logo=new Rect();
rt_gift=new Rect();
rt_account=new Rect();
}
@Override
public void onDraw(Canvas canvas)
{
super.onDraw(canvas);
if(logoIsClose)//
{
//畫logo
float left=currentx;
float top=currenty;
if(left<=0)
{
left=0;
}
if(left>=screenwidth)
{
left=screenwidth;
}
if(top<=0)
{
top=0;
}
if(top>screenheigh)
{
top=screenheigh;
}
if(!isFirstshow)//非第一次進入
{
left=left-bp_logo.getWidth()/2;
top=top-bp_logo.getHeight()/2;
}
isFirstshow=false;
canvas.drawBitmap(bp_logo,left,top, pic_Paint);
rt_logo.left=(int)left;
rt_logo.top=(int)top;
rt_logo.right=(int)left+bp_logo.getWidth();
rt_logo.bottom=(int)top+bp_logo.getHeight();
//禮包區域
rt_gift.left=0;
rt_gift.top=0;
rt_gift.right=0;
rt_gift.bottom=0;
//賬號區域
rt_account.left=0;
rt_account.top=0;
rt_account.right=0;
rt_account.bottom=0;
}
else
{
isFirstshow=false;
float left=currentx;
float top=currenty;
if(left<=0)
{
left=0;
}
if(left>=screenwidth)
{
left=screenwidth;
}
if(top<=0)
{
top=0;
}
if(top>screenheigh)
{
top=screenheigh;
}
left=left-bp_logo.getWidth()/2;
top=top-bp_logo.getHeight()/2;
//畫logo
canvas.drawBitmap(bp_logo,left,top, pic_Paint);
//畫禮包圖片
canvas.drawBitmap(bp_gift,left+bp_logo.getWidth()+leftpadd,top, pic_Paint);
//畫禮包文字
canvas.drawText("禮包",left+bp_logo.getWidth()+leftpadd+bp_logo.getWidth()/2,top+bp_gift.getHeight()+leftpadd,txt_Paint);
//畫賬號圖片
canvas.drawBitmap(bp_account,left+bp_logo.getWidth()+20+bp_gift.getWidth()+leftpadd,top, pic_Paint);
//畫賬號文字
canvas.drawText("賬號",left+bp_logo.getWidth()+leftpadd+bp_gift.getWidth()+leftpadd+leftpadd,top+bp_account.getHeight()+leftpadd,txt_Paint);
//logo區域
rt_logo.left=(int)left;
rt_logo.top=(int)top;
rt_logo.right=(int)left+bp_logo.getWidth();
rt_logo.bottom=(int)top+bp_logo.getHeight();
//禮包區域
rt_gift.left=rt_logo.right+leftpadd;
rt_gift.top=(int)top;
rt_gift.right=rt_gift.left+bp_gift.getWidth();
rt_gift.bottom=(int)top+bp_gift.getHeight();
//賬號區域
rt_account.left=rt_gift.right+leftpadd;
rt_account.top=(int)top;
rt_account.right=rt_account.left+bp_account.getWidth();
rt_account.bottom=(int)top+bp_account.getHeight();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
x = event.getRawX();
y = event.getRawY();
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
x = event.getX();
y = event.getY();
mStartX = x;
mStartY = y;
int clickposition1=clickStrict((int)x,(int)y);
Log.e("down","click.down.clickposition="+clickposition1);
if(clickposition1==0)//其他區域
{
return false;
}
break;
case MotionEvent.ACTION_MOVE:
x= event.getX();
y = event.getY();
currentx=x;
currenty=y;
//刷新
this.postInvalidate();
break;
case MotionEvent.ACTION_UP:
x= event.getX();
y = event.getY();
if ((x - mStartX) < 10&& (y - mStartY) < 10) //點擊
{
int clickposition=clickStrict((int)x,(int)y);
if(clickposition==0)//其他區域
{
return false;
}
if(logoIsClose)
{
logoIsClose=false;
this.postInvalidate();
}
else
{
Log.e("clickstrict",clickposition+"___");
if(clickposition==1)
{
Toast.makeText(context,"點擊logo",Toast.LENGTH_LONG).show();
logoIsClose=true;
this.postInvalidate();
}
if(clickposition==2)
{
Toast.makeText(context,"點擊禮包",Toast.LENGTH_LONG).show();
}
if(clickposition==3)
{
Toast.makeText(context,"點擊賬號",Toast.LENGTH_LONG).show();
}
}
return false;
}
else
{
return false;
}
//break;
default:
}
return true;
}
/**
* 1,點擊logo,2,禮包,3賬號
* @param x
* @param y
* @return
*/
public int clickStrict(int x,int y)
{
Log.e("clickposition","x="+x+"___y="+y);
int clickposition=0;
if(x>=rt_logo.left&&y>=rt_logo.top&&x<=rt_logo.right&&y<=rt_logo.bottom)
{
clickposition=1;
}
if(x>=rt_gift.left&&y>=rt_gift.top&&x<=rt_gift.right&&y<=rt_gift.bottom)
{
clickposition=2;
}
if(x>=rt_account.left&&y>=rt_account.top&&x<=rt_account.right&&y<=rt_account.bottom)
{
clickposition=3;
}
return clickposition;
}
}