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

Android應(yīng)用內(nèi)懸浮窗Activity的簡單實現(xiàn)

 更新時間:2022年01月05日 11:44:42   作者:rustfisher.com  
懸浮窗相信大家應(yīng)該都不陌生,下面這篇文章主要給大家介紹了關(guān)于Android應(yīng)用內(nèi)懸浮窗Activity簡單實現(xiàn)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

懸浮窗是一種比較常見的需求。例如把視頻通話界面縮小成一個懸浮窗,然后用戶可以在其他界面上處理事情。

本文給出一個簡單的應(yīng)用內(nèi)懸浮窗實現(xiàn)。可縮小activity和還原大小。可懸浮在同一個app的其他activity上。使用TouchListener監(jiān)聽觸摸事件,拖動懸浮窗。

縮放方法

縮放activity需要使用WindowManager.LayoutParams,控制window的寬高

在activity中調(diào)用

android.view.WindowManager.LayoutParams p = getWindow().getAttributes();
p.height = 480; // 高度
p.width = 360;  // 寬度
p.dimAmount = 0.0f; // 不讓下面的界面變暗
getWindow().setAttributes(p);

dim: adj. 暗淡的; 昏暗的; 微弱的; 不明亮的; 光線暗淡的; v. (使)變暗淡,變微弱,變昏暗; (使)減弱,變淡漠,失去光澤;

修改了WindowManager.LayoutParams的寬高,activity的window大小會發(fā)生變化。

要變回默認(rèn)大小,在activity中調(diào)用

getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

如果縮小時改變了位置,需要把window的位置置為0

WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.x = 0;
lp.y = 0;
getWindow().setAttributes(lp);

activity變小時,后面可能是黑色的背景。這需要進(jìn)行下面的操作。

懸浮樣式

在styles.xml里新建一個MeTranslucentAct。

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowNoTitle">true</item>
    </style>

    <style name="TranslucentAct" parent="AppTheme">
        <item name="android:windowBackground">#80000000</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
    </style>
</resources>

主要style是AppCompat的。

指定一個window的背景android:windowBackground 使用的Activity繼承自androidx.appcompat.app.AppCompatActivity

activity縮小后,背景是透明的,可以看到后面的其他頁面

點擊穿透空白

activity縮小后,點擊旁邊空白處,其他組件能接到點擊事件

onCreate方法的setContentView之前,給WindowManager.LayoutParams添加標(biāo)記FLAG_LAYOUT_NO_LIMITSFLAG_NOT_TOUCH_MODAL

WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
layoutParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;

mBinding = DataBindingUtil.setContentView(this, R.layout.act_float_scale);

移動懸浮窗

監(jiān)聽觸摸事件,計算出手指移動的距離,然后移動懸浮窗。

private boolean mIsSmall = false; // 當(dāng)前是否小窗口
private float mLastTx = 0; // 手指的上一個位置x
private float mLastTy = 0;
// ....

    mBinding.root.setOnTouchListener((v, event) -> {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "down " + event);
                mLastTx = event.getRawX();
                mLastTy = event.getRawY();
                return true;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "move " + event);
                float dx = event.getRawX() - mLastTx;
                float dy = event.getRawY() - mLastTy;
                mLastTx = event.getRawX();
                mLastTy = event.getRawY();
                Log.d(TAG, "  dx: " + dx + ", dy: " + dy);
                if (mIsSmall) {
                    WindowManager.LayoutParams lp = getWindow().getAttributes();
                    lp.x += dx;
                    lp.y += dy;
                    getWindow().setAttributes(lp);
                }

                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "up " + event);
                return true;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "cancel " + event);
                return true;
        }
        return false;
    });

mIsSmall用來記錄當(dāng)前activity是否變?。☉腋。?。

在觸摸監(jiān)聽器中返回true,表示消費這個觸摸事件。

event.getX()event.getY()獲取到的是當(dāng)前View的觸摸坐標(biāo)。 event.getRawX()event.getRawY()獲取到的是屏幕的觸摸坐標(biāo)。即觸摸點在屏幕上的位置。

例子的完整代碼

啟用了databinding

android {
    dataBinding {
        enabled = true
    }
}

styles.xml

新建一個樣式

    <style name="TranslucentAct" parent="AppTheme">
        <item name="android:windowBackground">#80000000</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
    </style>

layout

act_float_scale.xml里面放一些按鈕,控制放大和縮小。 ConstraintLayout拿來監(jiān)聽觸摸事件。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#555555">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="vertical"
            app:layout_constraintTop_toTopOf="parent">

            <Button
                android:id="@+id/to_small"
                style="@style/NormalBtn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="變小" />

            <Button
                android:id="@+id/to_reset"
                style="@style/NormalBtn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="12dp"
                android:text="還原" />
        </LinearLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

activity

FloatingScaleAct

import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.WindowManager;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;

import com.rustfisher.tutorial2020.R;
import com.rustfisher.tutorial2020.databinding.ActFloatScaleBinding;

public class FloatingScaleAct extends AppCompatActivity {
    private static final String TAG = "rfDevFloatingAct";

    ActFloatScaleBinding mBinding;

    private boolean mIsSmall = false; // 當(dāng)前是否小窗口
    private float mLastTx = 0; // 手指的上一個位置
    private float mLastTy = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
        layoutParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;

        mBinding = DataBindingUtil.setContentView(this, R.layout.act_float_scale);

        mBinding.toSmall.setOnClickListener(v -> toSmall());
        mBinding.toReset.setOnClickListener(v -> {
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.x = 0;
            lp.y = 0;
            getWindow().setAttributes(lp);
            getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            mIsSmall = false;
        });

        mBinding.root.setOnTouchListener((v, event) -> {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    Log.d(TAG, "down " + event);
                    mLastTx = event.getRawX();
                    mLastTy = event.getRawY();
                    return true;
                case MotionEvent.ACTION_MOVE:
                    Log.d(TAG, "move " + event);
                    float dx = event.getRawX() - mLastTx;
                    float dy = event.getRawY() - mLastTy;
                    mLastTx = event.getRawX();
                    mLastTy = event.getRawY();
                    Log.d(TAG, "  dx: " + dx + ", dy: " + dy);
                    if (mIsSmall) {
                        WindowManager.LayoutParams lp = getWindow().getAttributes();
                        lp.x += dx;
                        lp.y += dy;
                        getWindow().setAttributes(lp);
                    }

                    break;
                case MotionEvent.ACTION_UP:
                    Log.d(TAG, "up " + event);
                    return true;
                case MotionEvent.ACTION_CANCEL:
                    Log.d(TAG, "cancel " + event);
                    return true;
            }
            return false;
        });
    }

    private void toSmall() {
        mIsSmall = true;

        WindowManager m = getWindowManager();
        Display d = m.getDefaultDisplay();
        WindowManager.LayoutParams p = getWindow().getAttributes();
        p.height = (int) (d.getHeight() * 0.35);
        p.width = (int) (d.getWidth() * 0.4);
        p.dimAmount = 0.0f;
        getWindow().setAttributes(p);
    }
}

manifest里注冊這個activity

<activity
    android:name=".act.FloatingScaleAct"
    android:theme="@style/TranslucentAct" />

運行效果

在紅米9A(Android 10,MIUI 12.5.1 穩(wěn)定版)和榮耀(Android 5.1)上運行OK

懸浮窗效果-紅米9A

小結(jié)

為實現(xiàn)懸浮窗效果,思路是改變activity大小,將activity所在window的背景設(shè)置透明,監(jiān)聽觸摸事件改變window的位置。 主要使用的類 WindowManager.LayoutParams

到此這篇關(guān)于Android應(yīng)用內(nèi)懸浮窗Activity實現(xiàn)的文章就介紹到這了,更多相關(guān)Android懸浮窗Activity內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android開發(fā)筆記 今天學(xué)到的一些屬性

    Android開發(fā)筆記 今天學(xué)到的一些屬性

    離開實驗室之前再貼上今天下午自己學(xué)到的一些基礎(chǔ)知識 上午干嘛了呢,忙著數(shù)據(jù)恢復(fù)呢
    2012-11-11
  • Android實現(xiàn)錄音功能實現(xiàn)實例(MediaRecorder)

    Android實現(xiàn)錄音功能實現(xiàn)實例(MediaRecorder)

    本篇文章主要介紹了Android實現(xiàn)錄音的實例代碼(MediaRecorder),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Android實現(xiàn)跳動的小球加載動畫效果

    Android實現(xiàn)跳動的小球加載動畫效果

    Android中有各式各樣的加載動畫,大家多多少少都見過,比如用過美團(tuán)客戶端的用戶對美團(tuán)那個加載小人的動畫印象很深刻,一個可愛的小人在那拼命的跑。這樣的動畫實現(xiàn)其實還有很多,今天這里就來實現(xiàn)一個跳動的小球效果。有需要的可以參考借鑒。
    2016-08-08
  • Android下拉刷新上拉加載更多左滑動刪除

    Android下拉刷新上拉加載更多左滑動刪除

    本文給大家分享一段代碼實現(xiàn)Android下拉刷新上拉加載更多仿ios左滑動刪除item,非常實用,代碼簡單易懂,特此分享腳本之家平臺供大家學(xué)習(xí)
    2016-01-01
  • 詳解Android6.0運行時權(quán)限管理

    詳解Android6.0運行時權(quán)限管理

    自從Android6.0發(fā)布以來,在權(quán)限上做出了很大的變動,不再是之前的只要在manifest設(shè)置就可以任意獲取權(quán)限,而是更加的注重用戶的隱私和體驗。本文詳細(xì)介紹了Android6.0運行時權(quán)限管理。需要的朋友一起來看下吧
    2016-12-12
  • Android studio無法創(chuàng)建類和接口和提示問題的完美解決辦法

    Android studio無法創(chuàng)建類和接口和提示問題的完美解決辦法

    這篇文章主要介紹了Android studio無法創(chuàng)建類和接口和提示問題解決辦法,內(nèi)容比較簡單,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-04-04
  • android底部菜單欄實現(xiàn)原理與代碼

    android底部菜單欄實現(xiàn)原理與代碼

    底部菜單欄很重要,我看了一下很多應(yīng)用軟件都是用了底部菜單欄做,我這里使用了tabhost做了一種通用的(就是可以像微信那樣顯示未讀消息數(shù)量的,雖然之前也做過但是layout下的xml寫的太臃腫,這里去掉了很多不必要的層,個人看起來還是不錯的,所以貼出來方便以后使用
    2013-01-01
  • android開發(fā)通過Scroller實現(xiàn)過渡滑動效果操作示例

    android開發(fā)通過Scroller實現(xiàn)過渡滑動效果操作示例

    這篇文章主要介紹了android開發(fā)通過Scroller實現(xiàn)過渡滑動效果,結(jié)合實例形式分析了Android Scroller類實現(xiàn)過渡滑動效果的基本原理與實現(xiàn)技巧,需要的朋友可以參考下
    2020-01-01
  • Android中butterknife的使用與自動化查找組件插件詳解

    Android中butterknife的使用與自動化查找組件插件詳解

    這篇文章主要給大家介紹了關(guān)于Android中butterknife的使用與自動化查找組件插件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Android AsyncTask用法巧用實例代碼

    Android AsyncTask用法巧用實例代碼

    這篇文章主要介紹了Android AsyncTask用法巧用實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評論

宜昌市| 绥宁县| 柘荣县| 新竹市| 桦川县| 迁西县| 始兴县| 靖江市| 法库县| 修水县| 石城县| 南木林县| 建德市| 台州市| 澎湖县| 屏东县| 谢通门县| 渝中区| 万安县| 康保县| 武汉市| 元谋县| 澜沧| 蒙城县| 昭觉县| 金华市| 乡城县| 湟中县| 汉寿县| 布尔津县| 龙泉市| 庆阳市| 府谷县| 长子县| 三河市| 保山市| 夹江县| 包头市| 会东县| 香港 | 松溪县|