学习|Android中Presentation分屏的简单使用

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为3862,预计阅读9分钟


分屏异显

做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

secPresentation代码

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)
    }
}

Activity代码

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()
            }
        }


    }




}


程序运行起来就是我们开始视频中的效果了

小贴士:如果自己没法外接屏幕的话,手机可以打开开发者选项--绘图--模拟辅助显示设备,自己选一个大小的屏幕也可实现双屏的效果

扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

Android通讯库VNanoMsg的1.0.1发布

学习|Android制作开源库

NanoMsg框架|Android的各模式通讯封装(不另编译动态库附DEMO地址)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值