真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在Android中實現(xiàn)微信文章懸浮窗效果-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)怎么在Android中實現(xiàn)微信文章懸浮窗效果,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計制作、網(wǎng)站建設(shè)與策劃設(shè)計,大足網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:大足等地區(qū)。大足做網(wǎng)站價格咨詢:18980820575

1、權(quán)限

首先我們要考慮的一個問題就是權(quán)限問題,因為要適配Android 7.0 8.0,添加懸浮窗是需要申請權(quán)限的,適配的比較全,可以直接拿來用。這里需要注意的是,為了適配Android 8.0,Window的類型需要配置一下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 //Android 8.0
 mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
 //其他版本
 mLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
}

2、添加ViewGroup到Window

判斷好權(quán)限之后,直接添加就可以了

@SuppressLint("CheckResult")
private void showWindow(Context context) {
 mWindowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
 mView = LayoutInflater.from(context).inflate(R.layout.article_window, null);

 ImageView ivImage = mView.findViewById(R.id.aw_iv_image);
 String imageUrl = SPUtil.getStringDefault(ARTICLE_IMAGE_URL, "");
 RequestOptions requestOptions = RequestOptions.circleCropTransform();
 requestOptions.placeholder(R.mipmap.ic_launcher_round).error(R.mipmap.ic_launcher_round);
 Glide.with(context).load(imageUrl).apply(requestOptions).into(ivImage);

 initListener(context);

 mLayoutParams = new WindowManager.LayoutParams();
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
 } else {
  mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
 }
 mLayoutParams.format = PixelFormat.RGBA_8888; //窗口透明
 mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; //窗口位置
 mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
 mLayoutParams.width = 200;
 mLayoutParams.height = 200;
 mLayoutParams.x = mWindowManager.getDefaultDisplay().getWidth() - 200;
 mLayoutParams.y = 0;
 mWindowManager.addView(mView, mLayoutParams);
}

3、View的拖拽實現(xiàn)

借助WindowManager.LayoutParams來實現(xiàn),mLayoutParams.x和mLayoutParams.y分別表示mView左上角的橫縱坐標(biāo),所以我們只需要改動這兩個值就行了,當(dāng)ACTION_UP時,計算當(dāng)前mView的中心點相對窗口的位置,然后將mView動態(tài)滑動到窗口左邊或者右邊:

//設(shè)置觸摸滑動事件
mView.setOnTouchListener(new View.OnTouchListener() {
 int startX, startY; //起始點
 boolean isMove; //是否在移動
 long startTime;
 int finalMoveX; //最后通過動畫將mView的X軸坐標(biāo)移動到finalMoveX
 @Override
 public boolean onTouch(View v, MotionEvent event) {
  switch (event.getAction()) {
   case MotionEvent.ACTION_DOWN:
    startX = (int) event.getX();
    startY = (int) event.getY();
    startTime = System.currentTimeMillis();
    isMove = false;
    return false;
   case MotionEvent.ACTION_MOVE:
    mLayoutParams.x = (int) (event.getRawX() - startX);
    mLayoutParams.y = (int) (event.getRawY() - startY);
    updateViewLayout(); //更新mView 的位置
    return true;
   case MotionEvent.ACTION_UP:
    long curTime = System.currentTimeMillis();
    isMove = curTime - startTime > 100;
    //判斷mView是在Window中的位置,以中間為界
    if (mLayoutParams.x + mView.getMeasuredWidth() / 2 >= mWindowManager.getDefaultDisplay().getWidth() / 2) {
     finalMoveX = mWindowManager.getDefaultDisplay().getWidth() - mView.getMeasuredWidth();
    } else {
     finalMoveX = 0;
    }
    //使用動畫移動mView
    ValueAnimator animator = ValueAnimator.ofInt(mLayoutParams.x, finalMoveX).setDuration(Math.abs(mLayoutParams.x - finalMoveX));
    animator.addUpdateListener((ValueAnimator animation) -> {
     mLayoutParams.x = (int) animation.getAnimatedValue();
     updateViewLayout();
    });
    animator.start();
    return isMove;
  }
  return false;
 }
});

4、注意

為了讓W(xué)indow與Activity脫離,這里我們采用Service來做,通過Service來添加和移除View;在權(quán)限申請成功之后我們需要通知Service(其實是Activity,可能會有保存數(shù)據(jù)等操作)作相應(yīng)改變(提供一個接口給Service),然后在Service中使用廣播來通知Activity;最后一個需要注意的地方就是我們需要判斷應(yīng)用程序是否在前臺還是后臺來添加或移除Window,這里通過使用ActivityLifecycleCallbacks來監(jiān)聽Activity在前臺的數(shù)量來判斷應(yīng)用程序是在前臺還是后臺

class ApplicationLifecycle : Application.ActivityLifecycleCallbacks {
 private var started: Int = 0
 override fun onActivityPaused(activity: Activity?) {
 }
 override fun onActivityResumed(activity: Activity?) {
 }
 override fun onActivityStarted(activity: Activity?) {
  started++
  if (started == 1) {
   Log.e("TAG", "應(yīng)用在前臺了?。?!")
  }
 }
 override fun onActivityDestroyed(activity: Activity?) {
 }
 override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
 }
 override fun onActivityStopped(activity: Activity?) {
  started--
  if (started == 0) {
   Log.e("TAG", "應(yīng)用在后臺了!?。?)
  }
 }
 override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
 }
}
Android是什么

Android是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機和平板電腦,由美國Google公司和開放手機聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。

以上就是怎么在Android中實現(xiàn)微信文章懸浮窗效果,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


本文名稱:怎么在Android中實現(xiàn)微信文章懸浮窗效果-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://weahome.cn/article/dhpjhi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部