国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

詳解android6.0版本下懸浮窗實現

2019-10-23 18:34:16
字體:
來源:轉載
供稿:網友

懸浮窗在安卓中實現起來還是比較容易的,這幾天在網上溫習了相關資料,運行在我安卓6.0手機上才發現,原來在6.0手機上不是行的。

第一反應肯定是權限相關問題,做了相關處理后,果然讓懸浮窗原形畢露了。直接貼代碼。

public class MainActivity extends AppCompatActivity {  private static final int ALERT_WINDOW_PERMISSION_CODE = 100;  private Button start_float;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    start_float = (Button) findViewById(R.id.start_float);    this.start_float.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View view) {        if (Build.VERSION.SDK_INT > 22) {          sdk23Permission();        } else {          startService(new Intent(MainActivity.this, FloatService.class));          finish();        }      }    });  }  /**   * @description 安卓6.0下權限處理   * @author ldm   * @time 2017/3/20 15:00   */  public void sdk23Permission() {    if (!Settings.canDrawOverlays(this)) {      Toast.makeText(MainActivity.this, "當前無權限使用懸浮窗,請授權!", Toast.LENGTH_SHORT).show();      Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,          Uri.parse("package:" + getPackageName()));      startActivityForResult(intent, ALERT_WINDOW_PERMISSION_CODE);    } else {      startService(new Intent(MainActivity.this, FloatService.class));      finish();    }  }  /**   * 用戶返回   */  protected void onActivityResult(int requestCode, int resultCode, Intent data) {    if (requestCode == ALERT_WINDOW_PERMISSION_CODE) {      if (!Settings.canDrawOverlays(this)) {        Toast.makeText(MainActivity.this, "權限授予失敗,無法開啟懸浮窗", Toast.LENGTH_SHORT).show();      } else {        startService(new Intent(MainActivity.this, FloatService.class));        finish();      }    }  }}

對應Service:

public class FloatService extends Service {  @Nullable  @Override  public IBinder onBind(Intent intent) {    return null;  }  @Override  public void onCreate() {    FloatViewUtils.getInstance(this).addFloatView();    super.onCreate();  }}

簡單地FloatView:

public class FloatView extends View {  public static final int WIDTH = 150;  public static final int HEIGHT = 150;  private Paint circlePaint;  private Paint textPaint;  private static final String text = "50%";  public FloatView(Context context) {    this(context, null, 0);  }  public FloatView(Context context, @Nullable AttributeSet attrs) {    this(context, attrs, 0);  }  public FloatView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    initPaints();  }  /**   * @description 初始化相關畫筆Paint   * @author ldm   * @time 2017/3/20   */  private void initPaints() {    circlePaint = new Paint();    circlePaint.setAntiAlias(true);    circlePaint.setColor(Color.GRAY);    textPaint = new Paint();    //設置抗鋸齒    textPaint.setAntiAlias(true);    //設置字體大小    textPaint.setTextSize(30);    //設置顏色    textPaint.setColor(Color.WHITE);    //設置(仿)粗體    textPaint.setFakeBoldText(true);  }  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    setMeasuredDimension(WIDTH, HEIGHT);  }  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    canvas.drawCircle(WIDTH / 2, HEIGHT / 2, WIDTH / 2, circlePaint);    float textWidth = textPaint.measureText(text);    float x = WIDTH / 2 - textWidth / 2;    Paint.FontMetrics fms = textPaint.getFontMetrics();    float dy = -(fms.descent + fms.ascent) / 2;    float y = HEIGHT / 2 + dy;    canvas.drawText(text, x, y, textPaint);  }}

以及FloatView管理工具類:

public class FloatViewUtils {  private static FloatViewUtils instance;  private Context mContext;  private WindowManager manager;  private FloatView floatView;  private FloatViewUtils(Context mContext) {    this.mContext = mContext;    manager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);    floatView = new FloatView(mContext);  }  public static FloatViewUtils getInstance(Context mContext) {    if (null == instance) {      synchronized (FloatViewUtils.class) {        if (null == instance) {          instance = new FloatViewUtils(mContext);        }      }    }    return instance;  }  public void addFloatView() {    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();    //懸浮窗口大小    lp.width = floatView.WIDTH;    lp.height = floatView.HEIGHT;    // 調整懸浮窗口位置    lp.gravity = Gravity.LEFT | Gravity.CENTER;    // 以屏幕左上角為原點,設置x、y初始值//    lp.x = 0;//    lp.y = 0;    //設置懸浮窗口類型    lp.type = WindowManager.LayoutParams.TYPE_PHONE;    //設置懸浮窗口不接受焦點及觸摸事件    lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;    //設置圖片格式,效果為背景透明    lp.format = PixelFormat.RGBA_8888;    manager.addView(floatView, lp);  }}

最后不要忘記在AndroidManifest.xml中添加權限(當然還有注冊Service):

 

復制代碼 代碼如下:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 神农架林区| 城固县| 乐平市| 腾冲县| 怀仁县| 柏乡县| 盐亭县| 江津市| 兴山县| 平塘县| 大邑县| 休宁县| 吴堡县| 老河口市| 方山县| 宜章县| 通渭县| 涿州市| 黄冈市| 枣强县| 邵阳市| 吴旗县| 锡林郭勒盟| 三门县| 湘阴县| 乐山市| 渝北区| 平罗县| 城固县| 上饶市| 宣化县| 东莞市| 闽清县| 民勤县| 济南市| 来凤县| 邛崃市| 嘉祥县| 淅川县| 奉节县| 临澧县|