最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年03月20日 17:17:51   作者:遲做總比不做強  
這篇文章主要介紹了詳解android6.0版本下懸浮窗實現(xiàn),懸浮窗在安卓中實現(xiàn)起來還是比較容易的,非常具有實用價值,需要的朋友可以參考下。

懸浮窗在安卓中實現(xiàn)起來還是比較容易的,這幾天在網(wǎng)上溫習了相關資料,運行在我安卓6.0手機上才發(fā)現(xiàn),原來在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;
    // 調(diào)整懸浮窗口位置
    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"/>

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

胶州市| 腾冲县| 龙川县| 靖边县| 平顺县| 阜南县| 缙云县| 嘉禾县| 彝良县| 枞阳县| 胶州市| 苏尼特左旗| 碌曲县| 奈曼旗| 卓尼县| 信宜市| 永修县| 桐庐县| 石嘴山市| 务川| 华阴市| 河南省| 黄浦区| 宿迁市| 康定县| 甘南县| 福贡县| 慈溪市| 华容县| 河间市| 雷州市| 德昌县| 乌什县| 朝阳县| 桃江县| 龙州县| 昭苏县| 囊谦县| 张家港市| 平度市| 深圳市|