android 圆形弹窗摄像头开发踩坑——源码————未来之窗跨平台操作

一、飘窗刷脸,拍照采用飘窗

刷脸认证安卓接口采用飘窗具有在不干扰用户主要操作的前提下以醒目方式引导用户完成认证,且能灵活定制样式以提升用户体验和认证效率的优点

二、踩坑只有一个扇形

 

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="100dp"android:layout_height="100dp"xmlns:app="http://schemas.android.com/apk/res-auto"><androidx.cardview.widget.CardViewandroid:id="@+id/popfacebgcard2"android:layout_width="280dp"android:layout_height="280dp"app:cardCornerRadius="280dp"android:layout_gravity="center"></androidx.cardview.widget.CardView></FrameLayout>

三、方形改圆形

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="100dp"android:layout_height="100dp"xmlns:app="http://schemas.android.com/apk/res-auto"><androidx.cardview.widget.CardViewandroid:id="@+id/popfacebgcard2"android:layout_width="280dp"android:layout_height="280dp"app:cardCornerRadius="280dp"android:layout_gravity="center"></androidx.cardview.widget.CardView></FrameLayout>

  app:cardCornerRadius="280dp"

四、通用圆形

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="296dp"android:layout_height="296dp"xmlns:app="http://schemas.android.com/apk/res-auto"><androidx.cardview.widget.CardViewandroid:id="@+id/popfacebgcard2"android:layout_width="280dp"android:layout_height="280dp"app:cardCornerRadius="280dp"android:layout_gravity="center"><TextureViewandroid:id="@+id/textureView"android:layout_width="fill_parent"android:layout_height="fill_parent"/></androidx.cardview.widget.CardView></FrameLayout>

 五、加外框

六、圆形外框

 

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="296dp"android:layout_height="296dp"xmlns:app="http://schemas.android.com/apk/res-auto"><androidx.cardview.widget.CardViewandroid:id="@+id/popfacebgcard"android:layout_width="296dp"android:layout_height="296dp"app:cardCornerRadius="296dp"android:background="#0078D7"><androidx.cardview.widget.CardViewandroid:id="@+id/popfacebgcard2"android:layout_width="280dp"android:layout_height="280dp"app:cardCornerRadius="280dp"android:layout_gravity="center"><!--<LinearLayoutandroid:id="@+id/popfacebg"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@drawable/face_border">
--><TextureViewandroid:id="@+id/textureView"android:layout_width="fill_parent"android:layout_height="fill_parent"/><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="智慧押金"></TextView><!--</LinearLayout>--></androidx.cardview.widget.CardView></androidx.cardview.widget.CardView><!--<View        android:id="@+id/circularPopupView"android:layout_width="match_parent"android:layout_height="match_parent"><SurfaceViewandroid:id="@+id/surfaceViewInPopup"android:layout_width="match_parent"android:layout_height="match_parent" /></View>--></FrameLayout>

七、弹窗

 private void showPopup() {LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);popupView = inflater.inflate(R.layout.cyberwin_popup_face_layout, null);Context cyberwincpu=this;//  circularPopupView = popupView.findViewById(R.id.circularPopupView);// surfaceViewInPopup = popupView.findViewById(R.id.surfaceViewInPopup);// surfaceHolderInPopup = surfaceViewInPopup.getHolder();// surfaceHolderInPopup.addCallback(this);textureView = popupView.findViewById(R.id.textureView);//  LinearLayout popfacebg背景   = popupView.findViewById(R.id.popfacebg);CardView popfacebg背景2   = popupView.findViewById(R.id.popfacebgcard);WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,PixelFormat.TRANSLUCENT);WindowManager.LayoutParams params小窗口 = new WindowManager.LayoutParams(DensityUtils.dp2px(this, 296),DensityUtils.dp2px(this, 296),WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,PixelFormat.TRANSLUCENT);params小窗口.format = PixelFormat.RGBA_8888;//设置图片格式params.gravity = Gravity.CENTER;// 创建圆角背景//  GradientDrawable drawable = new GradientDrawable();//  drawable.setColor(Color.RED); // 设置背景颜色// drawable.setCornerRadius(100); // 设置圆角半径
/*if (popupView instanceof LinearLayout) {((LinearLayout) popupView).setBackground(drawable);}*///  ((LinearLayout) popupView).setBackground(drawable);// circularPopupView.setBackground(drawable);
/*// 将圆角背景设置为悬浮窗口的背景if (popupView instanceof LinearLayout) {((LinearLayout) popupView).setBackground(drawable);}*/// 当 TextureView 可用时,打开摄像头//  ViewGroup.LayoutParams layoutParams摄像头 = textureView.getLayoutParams();//  ViewGroup.LayoutParams layoutParams摄像头背景 = popfacebg背景2.getLayoutParams();// 设置宽度为 400 像素//  layoutParams摄像头.width = 350;// 设置高度为 600 像素//  layoutParams摄像头.height = 350;// popfacebg背景2.setCardr// popfacebg背景2.setLayoutParams(layoutParams摄像头背景);// 设置宽度为 400 像素// layoutParams摄像头.width = 350;// 设置高度为 600 像素// layoutParams摄像头.height = 350;// 应用新的布局参数// textureView.setLayoutParams(layoutParams摄像头);int paddingLeftInPx =  DensityUtils.dp2px(this, 8);//  popfacebg背景2.setPadding(paddingLeftInPx, paddingLeftInPx, paddingLeftInPx, paddingLeftInPx);// popfacebg背景2.setBackgroundColor(Color.parseColor("#0078D7"));textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {// openCamera();//  Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)//    .setAction("Action", null)//    .setAnchorView(R.id.fab).show();Toast.makeText(cyberwincpu,"显示界面",Toast.LENGTH_SHORT);// drawCircle(textureView);打开摄像头(textureView);}@Overridepublic void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {return false;}@Overridepublic void onSurfaceTextureUpdated(SurfaceTexture surface) {}});windowManager.addView(popupView, params小窗口);//  popupView//  circularPopupView.setOnTouchListener(new View.OnTouchListener() {// popupView.setOnTouchListener(new View.OnTouchListener() {//  circularPopupView.setOnTouchListener(new View.OnTouchListener() {popupView.setOnTouchListener(new View.OnTouchListener() {int initialX, initialY;int initialTouchX, initialTouchY;@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:initialX = params小窗口.x;initialY = params小窗口.y;initialTouchX = (int) event.getRawX();initialTouchY = (int) event.getRawY();return true;case MotionEvent.ACTION_UP:return true;case MotionEvent.ACTION_MOVE:params小窗口.x = initialX + (int) (event.getRawX() - initialTouchX);params小窗口.y = initialY + (int) (event.getRawY() - initialTouchY);drawCircle(popupView);windowManager.updateViewLayout(popupView, params小窗口);return true;}return false;}});}

八、摄像头
 

 private android.hardware.Camera camera摄像头;private void 打开摄像头(TextureView tv) {try {int cameraId = 仙盟_冥界_摄像头_寻找前置();if (cameraId != -1) {camera摄像头 = android.hardware.Camera.open(cameraId);}else{camera摄像头 = android.hardware.Camera.open();// cameraId=0;}android.hardware.Camera.Parameters parameters = camera摄像头.getParameters();android.hardware.Camera.Size previewSize = parameters.getPreviewSize();android.hardware.Camera.Size pictureSize = parameters.getPictureSize();camera摄像头.setDisplayOrientation(90);//注意顺序camera摄像头.setParameters(parameters);camera摄像头.setPreviewTexture(tv.getSurfaceTexture());camera摄像头.startPreview();//// 设置相机的预览方向//   setCameraDisplayOrientation(this, cameraId, camera摄像头);} catch (Exception e) {e.printStackTrace();}}private int 仙盟_冥界_摄像头_寻找前置() {int cameraCount = android.hardware.Camera.getNumberOfCameras();android.hardware.Camera.CameraInfo cameraInfo = new android.hardware.Camera.CameraInfo();for (int i = 0; i < cameraCount; i++) {android.hardware.Camera.getCameraInfo(i, cameraInfo);if (cameraInfo.facing == android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT) {return i;}}return -1;}// 设置相机的预览方向public  void setCameraDisplayOrientation(Context context, int cameraId, Camera camera) {try{Camera.CameraInfo info = new Camera.CameraInfo();Camera.getCameraInfo(cameraId, info);WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);int rotation = windowManager.getDefaultDisplay().getRotation();int degrees = 0;switch (rotation) {case android.view.Surface.ROTATION_0:degrees = 0;break;case android.view.Surface.ROTATION_90:degrees = 90;break;case android.view.Surface.ROTATION_180:degrees = 180;break;case android.view.Surface.ROTATION_270:degrees = 270;break;}int result;if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {result = (info.orientation + degrees) % 360;result = (360 - result) % 360;  // 前置摄像头需要镜像处理} else {  // 后置摄像头result = (info.orientation - degrees + 360) % 360;}camera.setDisplayOrientation(result);} catch (Exception e) {e.printStackTrace();Toast.makeText(this,"设置相机的预览方向"+e.getMessage(),Toast.LENGTH_SHORT);}}private void releaseCamera() {if (camera摄像头 != null) {camera摄像头.stopPreview();camera摄像头.release();camera摄像头 = null;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子电气架构 --- 在智能座舱基础上定义人机交互

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

图漾相机——Sample_V1示例程序

文章目录 1.SDK支持的平台类型1.1 Windows 平台1.2 Linux平台 2.SDK基本知识2.1 SDK目录结构2.2 设备组件简介2.3 设备组件属性2.4 设备的帧数据管理机制2.5 SDK中的坐标系变换 3.Sample_V1示例程序3.1 DeviceStorage3.2 DumpCalibInfo3.3 NetStatistic3.4 SimpleView_SaveLoad…

idea对jar包内容进行反编译

1.先安装一下这个插件java Bytecode Decompiler 2.找到这个插件的路径&#xff0c;在idea的plugins下面的lib文件夹内&#xff1a;java-decompiler.jar。下面是我自己本地的插件路径&#xff0c;以作参考&#xff1a; D:\dev\utils\idea\IntelliJ IDEA 2020.1.3\plugins\java-d…

1.五子棋对弈python解法——2024年省赛蓝桥杯真题

问题描述 原题传送门&#xff1a;1.五子棋对弈 - 蓝桥云课 "在五子棋的对弈中&#xff0c;友谊的小船说翻就翻&#xff1f;" 不&#xff01;对小蓝和小桥来说&#xff0c;五子棋不仅是棋盘上的较量&#xff0c;更是心与心之间的沟通。这两位挚友秉承着"友谊第…

基于STM32的智能停车场管理系统设计

目录 引言系统设计 硬件设计软件设计 系统功能模块 车辆识别与进出管理模块车位检测与引导模块计费与支付模块数据存储与查询模块远程监控与异常报警模块 控制算法 车牌识别与车辆进出管理算法车位检测与引导算法计费与支付处理算法数据存储与远程反馈算法 代码实现 车辆检测与…

单细胞-第五节 多样本数据分析,打分R包AUCell

文件在单细胞\5_GC_py\1_single_cell\3.AUCell.Rmd 1.基因 rm(list = ls()) load("g.Rdata")2.AUCell https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9897923 IF: NA NA NA用这个文章里的方法,将单细胞亚群的marker基因与ros相关基因取交集,用作AUCell的基因集…

蓝牙技术在物联网中的应用有哪些

蓝牙技术凭借低功耗、低成本和易于部署的特性&#xff0c;在物联网领域广泛应用&#xff0c;推动了智能家居、工业、医疗、农业等多领域发展。 智能家居&#xff1a;在智能家居系统里&#xff0c;蓝牙技术连接各类设备&#xff0c;像智能门锁、智能灯泡、智能插座、智能窗帘等。…

NLP深度学习 DAY5:Seq2Seq 模型详解

Seq2Seq&#xff08;Sequence-to-Sequence&#xff09;模型是一种用于处理输入和输出均为序列任务的深度学习模型。它最初被设计用于机器翻译&#xff0c;但后来广泛应用于其他任务&#xff0c;如文本摘要、对话系统、语音识别、问答系统等。 核心思想 Seq2Seq 模型的目标是将…

单细胞-第四节 多样本数据分析,下游画图

文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…

NLP模型大对比:Transformer >Seq2Seq > LSTM > RNN > n-gram

结论 Transformer 大于 传统的Seq2Seq 大于 LSTM 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异&#xff1a; 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的&q…

Julius AI 人工智能数据分析工具介绍

Julius AI 是一款由 Casera Labs 开发的人工智能数据分析工具&#xff0c;旨在通过自然语言交互和强大的算法能力&#xff0c;帮助用户快速分析和可视化复杂数据。这款工具特别适合没有数据科学背景的用户&#xff0c;使数据分析变得简单高效。 核心功能 自然语言交互&#x…

H3CNE-31-BFD

Bidirectional Forwarding Dection&#xff0c;双向转发检查 作用&#xff1a;毫秒级故障检查&#xff0c;通常结合三层协议&#xff08;静态路由、vrrp、ospf、BGP等&#xff09;&#xff0c;实现链路故障快速检查。 BFD配置示例 没有中间的SW&#xff0c;接口down&#xff…

2025最新版MySQL安装使用指南

2025最新版MySQL安装使用指南 The Installation and Usage Guide of the Latest Version of Oracle MySQL in 2025 By JacksonML 1. 获取MySQL 打开Chrome浏览器&#xff0c;访问官网链接&#xff1a;https://www.mysql.com/ &#xff0c;随即打开MySQL官网主页面&#xff…

[前端开发]记录国内快速cdn库,用于在线引入JavaScript第三方库

字节跳动的两个库,官网地址如下,搜索时优先找第一个,可用来链接axios,Boostrap等等第三方库 1. 字节跳动静态资源公共库 比如说搜索lodash,用于节流防抖的库,点击复制即可,一般是****.js或****.min.js这样的为后缀名的链接 点击复制即可, <script src"https://lf9-cd…

【云安全】云原生-K8S-搭建/安装/部署

一、准备3台虚拟机 务必保证3台是同样的操作系统&#xff01; 1、我这里原有1台centos7&#xff0c;为了节省资源和效率&#xff0c;打算通过“创建链接克隆”2台出来 2、克隆之前&#xff0c;先看一下是否存在k8s相关组件&#xff0c;或者docker相关组件 3、卸载原有的docker …

vim交换文件的作用

1.数据恢复&#xff1a;因为vim异常的退出&#xff0c;使用交换文件可以恢复之前的修改内容。 2.防止多人同时编辑&#xff1a;vim检测到交换文件的存在,会给出提示&#xff0c;以避免一个文件同时被多人编辑。 &#xff08;vim交换文件的工作原理&#xff1a;vim交换文件的工作…

【Block总结】OutlookAttention注意力,捕捉细节和局部特征|即插即用

论文信息 标题: VOLO: Vision Outlooker for Visual Recognition作者: Li Yuan, Qibin Hou, Zihang Jiang, Jiashi Feng, Shuicheng Yan代码链接: https://github.com/sail-sg/volo论文链接: https://arxiv.org/pdf/2106.13112 创新点 前景注意力机制: VOLO引入了一种称为“…

【Unity3D】实现横版2D游戏角色二段跳、蹬墙跳、扶墙下滑

目录 一、二段跳、蹬墙跳 二、扶墙下滑 一、二段跳、蹬墙跳 GitHub - prime31/CharacterController2D 下载工程后直接打开demo场景&#xff1a;DemoScene&#xff08;Unity 2019.4.0f1项目环境&#xff09; Player物体上的CharacterController2D&#xff0c;Mask添加Wall层…

premierePro 2022创建序列方式

概念 序列类似于画画的画布&#xff0c;类似ps的蒙层 一、新建序列方式 1、文件-新建-序列 2、直接将视频拖入时间轴&#xff08;没有序列时&#xff0c;如果有序列不行&#xff09; 3、右键右下角空白处 4、点击新建项按钮

九大服务构建高效 AIOps 平台,全面解决GenAI落地挑战

最近,DevOps运动的联合创始人Patrick Debois分享了他对AI平台与软件研发关系的深刻见解,让我们一起来探讨这个话题。 在AI的落地过程中,我们面临着两个主要难题: 引入AI编码工具后的开发者角色转变:随着像GitHub Copilot这样的AI工具的普及,工程师的角色正在发生深刻变革…