안 드 로 이 드 6.0 버 전에 서 부상 창 구현

6264 단어 android부유 창
현탁 창 은 안 드 로 이 드 에서 실현 되 기 가 비교적 쉽다.요 며칠 동안 인터넷 에서 관련 자 료 를 복습 하고 안 드 로 이 드 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();
      }

    }
  }
}

대응 서비스:

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"/>
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기