分屏异显
做POS销售的朋友应该都知道,现在的很多POS机销售都是两个显示器,对面的那个显示销售的产品和播放广告作用,在Windows中实现其实很简单,直接做一个新的窗体,然后在桌面设置双屏为扩展,显示的时候起始坐标为第一屏的分辨率后开始就可以了,因为现在主要做Android,有可能会用这个方面,所以提前研究了一下,做了个简单的小显示,没作任何优化。
实现效果
微卡智享
Presentation类
微卡智享
Presentation是一个特殊的dialog,它的目的是显示内容到第二屏幕。在Presentation创建的时候关联一个目标设备,确定Presentation要显示在那个设备上,根据这个设备的信息来配置Presentation的context和resources信息。
当Presentation附属的display被移除的话,Presentation就会自动被取消。当创建Presentation的Activity自己处于paused或者resumed,无论Presentation在显示什么内容,该Activity就要关心对Presentation 进行pausing and resuming。
使用流程
微卡智享
# | 需要掌握的技能 |
---|---|
1 | 通过DisplayManager获取Display个数,如果大于1就说明有多个屏幕,然后获取自己要定义的display |
2 | 创建类继承自Presentation,在构造函数中传入当前的Activity和display,通过setContentView加载布局文件,所以自己设置xml |
3 | 设置窗口显示类型 |
4 | 通过show方法直接调用出来 |
由上面的步骤可以看出来,使用这个还是非常简单的,我的代码中使用了JzVideo的第三方框架,具体怎么用可以看《学习|Android播放网络视频综合运用》
主界面中一个EditText,一个Button和一个TextView
第二屏的布局里面一个JzVideostd,一个TextView
package com.vaccae.displaydemo
import android.app.Presentation
import android.content.Context
import android.os.Bundle
import android.view.Display
import android.widget.Toast
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.second_display.*
/**
* 作者:Vaccae
* 邮箱:3657447@qq.com
* 创建时间:2020-03-03 13:44
* 功能模块说明:
*/
class secPresentation : Presentation {
private lateinit var mContext: Context
constructor(outerContext: Context?, display: Display?) : super(outerContext, display){
mContext = outerContext!!
}
fun settext(msg: String) {
prdshow.text = msg + "\r\n"
}
fun appendtext(msg: String) {
prdshow.append(msg + "\r\n")
}
fun setvideo(videourl: String, title:String ,picurl: String) {
jzvideo2.setUp(videourl,title)
Glide.with(mContext).load(picurl).into(jzvideo2.thumbImageView)
jzvideo2.startVideo()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.second_display)
}
}
package com.vaccae.displaydemo
import android.content.Context
import android.content.Intent
import android.hardware.display.DisplayManager
import android.net.Uri
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.Settings
import android.view.Display
import android.view.WindowManager
import android.widget.Toast
import com.bumptech.glide.Glide
import com.danikula.videocache.HttpProxyCacheServer
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private lateinit var proxyCacheServer: HttpProxyCacheServer
private val videos = arrayOf(
"http://www.sumsoft.cn/vedio/prnbluetooth.mp4",
"http://www.sumsoft.cn/vedio/SMPRM.mp4"
)
private val pictures = arrayOf(
"http://www.sumsoft.cn/uploads/allimg/191012/1-191012141244.png",
"http://www.sumsoft.cn/uploads/191210/1-1912101G154606.png"
)
// 屏幕管理类
private lateinit var mDisplayManager: DisplayManager
//第二屏类
private lateinit var secondPresentation: secPresentation
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
proxyCacheServer = HttpProxyCacheServer(this)
mDisplayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = mDisplayManager.displays
tvshow.text = "屏幕个数" + displays.size + "\r\n"
displays.forEach { it ->
tvshow.append("名称:" + it.name + " ID:" + it.displayId + "\r\n")
}
btnset.setOnClickListener {
if (displays.size > 1) {
secondPresentation.appendtext(edtinput.text.toString())
}
}
//将最后一个屏幕设置为第二屏
if (displays.size> 1) {
try {
val url=proxyCacheServer.getProxyUrl(videos[1])
val picurl=pictures[1]
val seconddisplay = displays[displays?.size!!.minus(1)]
secondPresentation = secPresentation(this, seconddisplay)
secondPresentation.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY)
secondPresentation.show()
secondPresentation.setvideo(
url,
"商盟质量追溯系统",
picurl
)
} catch (e: Exception) {
tvshow.append(e.message.toString()+"\r\n")
Toast.makeText(this,e.message.toString(),Toast.LENGTH_SHORT).show()
}
}
}
}
程序运行起来就是我们开始视频中的效果了
小贴士:如果自己没法外接屏幕的话,手机可以打开开发者选项--绘图--模拟辅助显示设备,自己选一个大小的屏幕也可实现双屏的效果