1. 程式人生 > >android 自定義類似91遊,360應用內懸浮球(不使用系統懸浮框)

android 自定義類似91遊,360應用內懸浮球(不使用系統懸浮框)

專案需要,製作類似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;		
    }
}