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

首頁 > 系統(tǒng) > Android > 正文

詳解android6.0版本下懸浮窗實(shí)現(xiàn)

2019-12-12 03:19:56
字體:
供稿:網(wǎng)友

懸浮窗在安卓中實(shí)現(xiàn)起來還是比較容易的,這幾天在網(wǎng)上溫習(xí)了相關(guān)資料,運(yùn)行在我安卓6.0手機(jī)上才發(fā)現(xiàn),原來在6.0手機(jī)上不是行的。

第一反應(yīng)肯定是權(quán)限相關(guān)問題,做了相關(guān)處理后,果然讓懸浮窗原形畢露了。直接貼代碼。

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下權(quán)限處理   * @author ldm   * @time 2017/3/20 15:00   */  public void sdk23Permission() {    if (!Settings.canDrawOverlays(this)) {      Toast.makeText(MainActivity.this, "當(dāng)前無權(quán)限使用懸浮窗,請(qǐng)授權(quán)!", 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, "權(quán)限授予失敗,無法開啟懸浮窗", Toast.LENGTH_SHORT).show();      } else {        startService(new Intent(MainActivity.this, FloatService.class));        finish();      }    }  }}

對(duì)應(yīng)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();  }}

簡(jiǎn)單地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 初始化相關(guān)畫筆Paint   * @author ldm   * @time 2017/3/20   */  private void initPaints() {    circlePaint = new Paint();    circlePaint.setAntiAlias(true);    circlePaint.setColor(Color.GRAY);    textPaint = new Paint();    //設(shè)置抗鋸齒    textPaint.setAntiAlias(true);    //設(shè)置字體大小    textPaint.setTextSize(30);    //設(shè)置顏色    textPaint.setColor(Color.WHITE);    //設(shè)置(仿)粗體    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;    // 調(diào)整懸浮窗口位置    lp.gravity = Gravity.LEFT | Gravity.CENTER;    // 以屏幕左上角為原點(diǎn),設(shè)置x、y初始值//    lp.x = 0;//    lp.y = 0;    //設(shè)置懸浮窗口類型    lp.type = WindowManager.LayoutParams.TYPE_PHONE;    //設(shè)置懸浮窗口不接受焦點(diǎn)及觸摸事件    lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;    //設(shè)置圖片格式,效果為背景透明    lp.format = PixelFormat.RGBA_8888;    manager.addView(floatView, lp);  }}

最后不要忘記在AndroidManifest.xml中添加權(quán)限(當(dāng)然還有注冊(cè)Service):

復(fù)制代碼 代碼如下:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 登封市| 安阳市| 辰溪县| 土默特右旗| 南澳县| 和硕县| 平顺县| 镇原县| 宁都县| 鸡泽县| 南京市| 龙门县| 镇安县| 乌拉特后旗| 乌苏市| 马尔康县| 白山市| 灌阳县| 黔江区| 登封市| 乌鲁木齐县| 江山市| 长丰县| 汝城县| 鄂托克前旗| 六枝特区| 兖州市| 敦煌市| 四子王旗| 广丰县| 会宁县| 望谟县| 四会市| 招远市| 鄢陵县| 监利县| 西丰县| 邻水| 临西县| 嘉定区| 三门县|