直播软件源码,设置悬浮窗并可进行任意位置的移动
直播软件源码,设置悬浮窗并可进行任意位置的移动
缩放方法
缩放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,表示消费这个触摸事件
以上就是 直播软件源码,设置悬浮窗并可进行任意位置的移动,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现