android 自定義類似91遊,360應用內懸浮球(不使用系統懸浮框)
阿新 • • 發佈:2019-01-04
專案需要,製作類似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; } }