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

首頁 > 系統 > Android > 正文

Android開發模仿qq視頻通話懸浮按鈕(實例代碼)

2019-12-12 03:39:23
字體:
來源:轉載
供稿:網友

模仿qq視頻通話的懸浮按鈕的實例代碼,如下所示;

public class FloatingWindowService extends Service{  private static final String TAG="OnTouchListener";  private static View mView = null;  private static WindowManager mWindowManager = null;  private static Context mContext = null;  public static Boolean isShown = false;  public WindowManager.LayoutParams params = null;  private int pixel;  private int TheOffset;  @Override  public void onCreate() {    super.onCreate();  }  @Override  public int onStartCommand(Intent intent, int flags, int startId) {    pixel = intent.getIntExtra("pixel",1);    showPopupWindow(this);    return super.onStartCommand(intent, flags, startId);  }  /**   * 顯示彈出框   *   * @param context   *   */  private void showPopupWindow(final Context context) {    if (isShown) {      return;    }    isShown = true;    // 獲取應用的Context    mContext = context.getApplicationContext();    // 獲取WindowManager    mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);    params = new WindowManager.LayoutParams();    mView = setUpView(context);    // 類型    params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;    int flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;    params.flags = flags;    params.format = PixelFormat.TRANSLUCENT;    params.width = WindowManager.LayoutParams.WRAP_CONTENT;    params.height = WindowManager.LayoutParams.WRAP_CONTENT;    params.gravity = Gravity.CENTER;    mWindowManager.addView(mView, params);  }  /**   * 隱藏彈出框   */  private static void hidePopupWindow() {    if (isShown && null != mView) {      mWindowManager.removeView(mView);      isShown = false;    }  }  private  int x=0;  private  int y=0;  private  int startX=0;  private  int startY=0;  private View setUpView(final Context context) {    View view = LayoutInflater.from(context).inflate(R.layout.popupwindow,        null);     TextView tv= (TextView) view.findViewById(R.id.title);    int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);    int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);    tv.measure(w, h);    TheOffset=(pixel-tv.getMeasuredWidth())/2-50;    tv.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        Intent intent =new Intent(context,MainActivity.class);        context.startActivity(intent);        // Toast.makeText(context,"點擊事件",Toast.LENGTH_LONG).show();      }    });    tv.setOnTouchListener(new View.OnTouchListener() {      @Override      public boolean onTouch(View v, MotionEvent event) {        switch (event.getAction()){          case MotionEvent.ACTION_MOVE:            int newX= (int) (event.getRawX()-x);            int newY= (int) (event.getRawY()-y);            params.x=newX+startX;            params.y=newY+startY;              mWindowManager.updateViewLayout(mView,params);            break;          case MotionEvent.ACTION_DOWN:            x= (int) event.getRawX();            y= (int) event.getRawY();            break;          case MotionEvent.ACTION_UP:            if(params.x>=0){              params.x=TheOffset;              mWindowManager.updateViewLayout(mView,params);            }            if(params.x<=-0){              params.x=-TheOffset;              mWindowManager.updateViewLayout(mView,params);            }            Log.i(TAG,params.x+"");            Log.i(TAG,params.y+"");            //判斷 從按住到抬起時候的移動距離, 如果如果移動距離大于20 那么就攔截事件,否則就不攔截事件,主要是處理點擊事件的沖突            if(Math.abs(startX-params.x)>20 ||Math.abs(startY-params.y)>20 ){              //記錄上一次的偏移量              startX=params.x;              startY=params.y;              return true;            }else {              startX=params.x;              startY=params.y;              return false;            }        }        return false;      }    });    return view;  }  @Nullable  @Override  public IBinder onBind(Intent intent) {    return null;  }  @Override  public void onDestroy() {    super.onDestroy();    if (mView != null) {      isShown=false;      mWindowManager.removeView(mView);    }  }  }

Main  

@Override    protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentView(R.layout.activity_main);      findViewById(R.id.open).setOnClickListener(this);      findViewById(R.id.close).setOnClickListener(this);    }

-點擊開啟 關閉懸浮按鈕 

@Override    public void onClick(View v) {      switch (v.getId()){        case R.id.open:          //判斷是否擁有懸浮權限          //op 的值是 0 ~ 47,其中0代表粗略定位權限,1代表精確定位權限,24代表懸浮窗權限。(具體可以看看Android源碼在android.app下就有個AppOpsManager類)          if(utils.checkOp(this,24)==0) {            Intent intent=new Intent(MainActivity.this, FloatingWindowService.class);            intent.putExtra("pixel",utils.pixel(this)[0]);            startService(intent);          }else {            //引導用戶進入懸浮權限設置界面            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,                Uri.parse("package:" + getPackageName()));            startActivityForResult(intent, 200);          }          break;        case R.id.close:          stopService(new Intent(MainActivity.this,FloatingWindowService.class));          break;      }    }

判斷權限 -獲取屏幕的寬高 

public class utils {      public static int checkOp(Context context, int op){        final int version = Build.VERSION.SDK_INT;        if (version >= 19){          Object object = context.getSystemService("appops");          Class c = object.getClass();          try {            Class[] cArg = new Class[3];            cArg[0] = int.class;            cArg[1] = int.class;            cArg[2] = String.class;            Method lMethod = c.getDeclaredMethod("checkOp", cArg);            return (Integer) lMethod.invoke(object, op, Binder.getCallingUid(), context.getPackageName());          } catch(NoSuchMethodException e) {            e.printStackTrace();          } catch (IllegalAccessException e) {            e.printStackTrace();          } catch (IllegalArgumentException e) {            e.printStackTrace();          } catch (InvocationTargetException e) {            e.printStackTrace();          }        }        return -1;      }      /**       * 獲取屏幕的寬高       * @param context       * @return       */      public static int[] pixel(Activity context){        DisplayMetrics dm = new DisplayMetrics();        context.getWindowManager().getDefaultDisplay().getMetrics(dm);        return new int[]{dm.widthPixels,dm.heightPixels};      }    }

--popupwindow填充布局文件 

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:orientation="vertical">    <LinearLayout      android:id="@+id/popup_window"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:background="@android:color/white"      android:orientation="vertical" >      <TextView        android:background="@mipmap/ic_launcher"        android:id="@+id/title"        android:layout_width="50dp"        android:layout_height="50dp"/>      </LinearLayout>  </LinearLayout>

以上所述是小編給大家介紹的Android開發模仿qq視頻通話懸浮按鈕(實例代碼),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 墨江| 盱眙县| 岢岚县| 象州县| 克什克腾旗| 卢氏县| 衢州市| 鄂伦春自治旗| 左云县| 于田县| 浙江省| 太谷县| 邯郸市| 太谷县| 内丘县| 北宁市| 巴彦淖尔市| 桐乡市| 巧家县| 温州市| 馆陶县| 曲靖市| 从化市| 辽宁省| 漳州市| 河津市| 南丹县| 绥芬河市| 浏阳市| 丽水市| 武宁县| 浠水县| 邓州市| 丽水市| 通河县| 利津县| 和平区| 应城市| 静安区| 石渠县| 苏尼特右旗|