直播软件源码,设置悬浮窗并可进行任意位置的移动

直播软件源码,设置悬浮窗并可进行任意位置的移动

缩放方法

缩放activity需要使用WindowManager.LayoutParams,控制window的宽高

在activity中调用

 

1
<br>android.view.WindowManager.LayoutParams p = getWindow().getAttributes();<br>p.height = 480; // 高度<br>p.width = 360;  // 宽度<br>p.dimAmount = 0.0f; // 不让下面的界面变暗<br>getWindow().setAttributes(p);<br>dim:

adj. 暗淡的; 昏暗的; 微弱的; 不明亮的; 光线暗淡的;

v. (使)变暗淡,变微弱,变昏暗; (使)减弱,变淡漠,失去光泽;

修改了WindowManager.LayoutParams的宽高,activity的window大小会发生变化。

要变回默认大小,在activity中调用

 

1
<br>getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

如果缩小时改变了位置,需要把window的位置置为0

 

1
<br>WindowManager.LayoutParams lp = getWindow().getAttributes();<br>lp.x = 0;<br>lp.y = 0;<br>getWindow().setAttributes(lp);

activity变小时,后面可能是黑色的背景。这需要进行下面的操作。

悬浮样式

在styles.xml里新建一个MeTranslucentAct

 

1
<br><resources><br>    <!-- Base application theme. --><br>    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><br>        <!-- Customize your theme here. --><br>        <item name="colorPrimary">@color/colorPrimary</item><br>        <item name="colorPrimaryDark">@color/colorPrimaryDark</item><br>        <item name="colorAccent">@color/colorAccent</item><br>        <item name="windowNoTitle">true</item><br>    </style><br>    <style name="TranslucentAct" parent="AppTheme"><br>        <item name="android:windowBackground">#80000000</item><br>        <item name="android:windowIsTranslucent">true</item><br>        <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item><br>    </style><br></resources>

主要style是AppCompat的

指定一个window的背景android:windowBackground

使用的Activity继承自androidx.appcompat.app.AppCompatActivity

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

点击穿透空白

activity缩小后,点击旁边空白处,其他组件能接到点击事件

 

1
<br>在onCreate方法的setContentView之前,给WindowManager.LayoutParams添加标记FLAG_LAYOUT_NO_LIMITS和FLAG_NOT_TOUCH_MODAL<br>WindowManager.LayoutParams layoutParams = getWindow().getAttributes();<br>layoutParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |<br>        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;<br>mBinding = DataBindingUtil.setContentView(this, R.layout.act_float_scale);

移动悬浮窗

监听触摸事件,计算出手指移动的距离,然后移动悬浮窗

 

1
<br>private boolean mIsSmall = false; // 当前是否小窗口<br>private float mLastTx = 0; // 手指的上一个位置x<br>private float mLastTy = 0;<br>// ....<br>    mBinding.root.setOnTouchListener((v, event) -> {<br>        switch (event.getAction()) {<br>            case MotionEvent.ACTION_DOWN:<br>                Log.d(TAG, "down " + event);<br>                mLastTx = event.getRawX();<br>                mLastTy = event.getRawY();<br>                return true;<br>            case MotionEvent.ACTION_MOVE:<br>                Log.d(TAG, "move " + event);<br>                float dx = event.getRawX() - mLastTx;<br>                float dy = event.getRawY() - mLastTy;<br>                mLastTx = event.getRawX();<br>                mLastTy = event.getRawY();<br>                Log.d(TAG, "  dx: " + dx + ", dy: " + dy);<br>                if (mIsSmall) {<br>                    WindowManager.LayoutParams lp = getWindow().getAttributes();<br>                    lp.x += dx;<br>                    lp.y += dy;<br>                    getWindow().setAttributes(lp);<br>                }<br>                break;<br>            case MotionEvent.ACTION_UP:<br>                Log.d(TAG, "up " + event);<br>                return true;<br>            case MotionEvent.ACTION_CANCEL:<br>                Log.d(TAG, "cancel " + event);<br>                return true;<br>        }<br>        return false;<br>    });

mIsSmall用来记录当前activity是否变小(悬浮)

在触摸监听器中返回true,表示消费这个触摸事件

以上就是 直播软件源码,设置悬浮窗并可进行任意位置的移动,更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(231)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示