当前位置: 首页 > news >正文

个人建站如何赚钱吉林市做网站公司

个人建站如何赚钱,吉林市做网站公司,网站建设大约多长时间,动漫制作专业平台CameraX是JetPack库之一#xff0c;通过CameraX可以向应用增加相机的功能。在下列内容中#xff0c;将介绍一个结合CameraX实现一个简单的拍照应用。本应用必须采用Android SDK 34。并通过该简单示例#xff0c;了解传统View层次组件的UI组件如何与Compose组件结合实现移动应…CameraX是JetPack库之一通过CameraX可以向应用增加相机的功能。在下列内容中将介绍一个结合CameraX实现一个简单的拍照应用。本应用必须采用Android SDK 34。并通过该简单示例了解传统View层次组件的UI组件如何与Compose组件结合实现移动应用界面的定制。 首先新建一个项目选择Empty Activity。 一、增加依赖使用CameraX 在新建项目的模块build.gradle.kt中增加依赖如下所示 //CameraXval camerax_version 1.3.0-beta04implementation(androidx.camera:camera-core:$camerax_version)implementation(androidx.camera:camera-camera2:${camerax_version})implementation(androidx.camera:camera-lifecycle:${camerax_version})implementation(androidx.camera:camera-video:${camerax_version})implementation(androidx.camera:camera-view:${camerax_version} )implementation(androidx.camera:camera-extensions:${camerax_version})//accompanist处理权限依赖库val accompanist_version 0.31.2-alphaimplementation(com.google.accompanist:accompanist-permissions:$accompanist_version)二、申请权限 1.AndroidManifest.xml配置使用照相机特性和权限 uses-feature android:nameandroid.hardware.camera android:requiredfalse / uses-permission android:nameandroid.permission.CAMERA / 2.申请使用拍照的权限 使用rememberPermissionState函数申请权限该函数的参数为permission表示需要申请的权限。rememberPermissionState函数的返回值为PermissionState类型表示获取权限的状态。 OptIn(ExperimentalPermissionsApi::class) Preview Composable fun CameraScreen() { val cameraPermissionState rememberPermissionState(permission android.Manifest.permission.CAMERA) LaunchedEffect(key1 Unit){if(!cameraPermissionState.status.isGranted !cameraPermissionState.status.shouldShowRationale){cameraPermissionState.launchPermissionRequest()} }if(cameraPermissionState.status.isGranted){//接受拍照的授权}else{//未授权显示未授权的界面 } } 在上述代码中,因为通过cameraPermissionState.launchPermissionRequest()请求申请照相机权限是一个异步过程因此将这个请求的处理放置在LaunchedEffect代码段内。 三、定义未授权的界面 OptIn(ExperimentalPermissionsApi::class) Composable fun NoPermissionScreen(cameraPermissionState: PermissionState) {Column(horizontalAlignment Alignment.CenterHorizontally){val message if(cameraPermissionState.status.shouldShowRationale){未获取照相机权限导致无法使用照相机功能}else{请授权照相机的权限}Text(message)Spacer(modifier Modifier.height(8.dp))Button(onClick{cameraPermissionState.launchPermissionRequest()}){Text(请求授权)}} }通过定义按钮的点击动作请求调用cameraPermissionState.launchPermissionRequest()再次申请权限。运行界面如下图所示 四、结合PreviewView实现预览相机画面 PreviewView这是一种可以剪裁、缩放和旋转以确保正确显示的 传统的视图组件。 可以结合Preview将处于活动状态的相机中的图片预览会流式传输到 PreviewView 中的 Surface。因为是传统的View系统的组件并不是Compose组件因此需要在Compose界面中利用AndroidView来使用View系统的组件。 PreviewView中有些属性需要注意 1缩放类型 相机预览视频分辨率常常与PreviewView 的尺寸不同需要通过设置缩放类型scaleType来剪裁或添加遮幅式黑边使得预览画面来适应视图保持原始宽高比。 FIT_CENTER、FIT_START 和 FIT_END用于添加遮幅式黑边。整个视频内容会调整放大或缩小为可在目标 PreviewView 中显示的最大尺寸。预览的内容会被完整显示。但是可能出现空白部分每一帧的画面会与FIT_CENTER目标视图的中心、FIT_START起始或FIT_END结束位置对齐。CameraX 使用的默认缩放类型是 FILL_CENTER。 三种设置的实现效果如下图所示图片来源https://developer.android.google.cn/static/images/training/camera/camerax/camera-preview/camera_preview_view_scale_type_fit.png?hlzh-cn。 2渲染画面的实现模式 PreviewView 的属性implementationMode用来设置画面渲染的实现模式实现模式主要有两种 PERFORMANCE 是默认模式。PreviewView 会使用 SurfaceView 显示视频串流但在某些情况下会回退为使用 TextureView。SurfaceView 具有专用的绘图界面该对象更有可能通过内部硬件合成器实现硬件叠加层尤其是当预览视频上面没有其他界面元素如按钮时。通过使用硬件叠加层进行渲染视频帧会避开 GPU 路径从而能降低平台功耗并缩短延迟时间。 COMPATIBLE 模式。在此模式下PreviewView 会使用 TextureView不同于 SurfaceView该对象没有专用的绘图表面。因此视频要通过混合渲染才能显示。在这个额外的步骤中应用可以执行额外的处理工作例如不受限制地缩放和旋转视频。 OptIn(ExperimentalMaterial3Api::class) Composable private fun CameraContent() {val context LocalContext.currentval lifecycleOwner LocalLifecycleOwner.currentval cameraController remember{LifecycleCameraController(context)}Scaffold(modifier Modifier.fillMaxSize()) { paddingValues: PaddingValues -Box(modifier Modifier.fillMaxSize()) {//在Compose中使用View系统中的PreviewViewAndroidView(modifier Modifier.fillMaxSize().padding(paddingValues),factory { context -PreviewView(context).apply {//设置布局宽度和高度占据全屏layoutParams LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)//设置背景颜色setBackgroundColor(Color.BLACK)//设置渲染的实现模式implementationMode PreviewView.ImplementationMode.COMPATIBLE//设置缩放方式scaleType PreviewView.ScaleType.FILL_START}.also{it.controller cameraControllercameraController.bindToLifecycle(lifecycleOwner)}},onReset {},onRelease {cameraController.unbind()})}} }这时重新修改CameraScreen代码如下 OptIn(ExperimentalPermissionsApi::class) Preview Composable fun CameraScreen() { val cameraPermissionState rememberPermissionState(permission android.Manifest.permission.CAMERA) LaunchedEffect(key1 Unit){if(!cameraPermissionState.status.isGranted !cameraPermissionState.status.shouldShowRationale){cameraPermissionState.launchPermissionRequest()} }if(cameraPermissionState.status.isGranted){//接受拍照的授权CameraContent() }else{//未授权显示未授权的界面 NoPermissionScreen(cameraPermissionState)} } 测试一下上述的代码模拟器运行效果如下图所示 但是从这个运行效果可以发现它仅仅是显示相机预览的画面功能有限。因此需要增加其他的功能。 四、拍照的处理 CameraX提供了拍照的功能通过调用takePicture来实现拍照。takePicture函数有两种形式 takePicture(Executor, OnImageCapturedCallback)此方法为拍摄的图片提供内存缓冲区。 takePicture(OutputFileOptions, Executor,OnImageSavedCallback)此方法将拍摄的图片保存到提供的文件位置。 运行 ImageCapture可自定义执行程序有两种类型回调执行程序和 IO 执行程序。 下列代码展示了一个简单的拍照功能通过调用takePicture(Executor, OnImageCapturedCallback)函数来实现。但是在下列代码中拍下的图片并没有保存仅仅是生成了一个Bitmap对象 OptIn(ExperimentalMaterial3Api::class) Composable private fun CameraContent() {val context LocalContext.currentval lifecycleOwner LocalLifecycleOwner.currentval cameraController remember{LifecycleCameraController(context)}//请求关联context的主线程的Excutorval cameraExecutor ContextCompat.getMainExecutor(context)Scaffold(modifier Modifier.fillMaxSize(),floatingActionButton {FloatingActionButton(onClick {cameraController.takePicture(cameraExecutor,object : ImageCapture.OnImageCapturedCallback(){override fun onCaptureSuccess(image: ImageProxy) {super.onCaptureSuccess(image)//拍照得到图片val cameraBitmap image.toBitmap()}override fun onError(exception: ImageCaptureException) {//拍照失败的处理}})}) {Icon(modifier Modifier.clip(CircleShape), painter painterResource(id R.mipmap.len),contentDescription 照相机)}},floatingActionButtonPosition FabPosition.Center) { paddingValues: PaddingValues -Box(modifier Modifier.fillMaxSize()) {//在Compose中使用View系统中的PreviewViewAndroidView(modifier Modifier.fillMaxSize().padding(paddingValues),factory { context -PreviewView(context).apply {layoutParams LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)//设置背景颜色setBackgroundColor(Color.BLACK)//设置渲染模式implementationMode PreviewView.ImplementationMode.COMPATIBLE//设置缩放方式scaleType PreviewView.ScaleType.FILL_START}.also{it.controller cameraControllercameraController.bindToLifecycle(lifecycleOwner)}},onReset {},onRelease {cameraController.unbind()})}} }运行效果在模拟器中如下图所示 可以注意到上述代码虽然可以将拍下的图片生成一个Bitmap对象但是并没有将这个图片保存到手机中。因此可以考虑通过调用 takePicture(OutputFileOptions, Executor,OnImageSavedCallback)函数来实现拍照并保存图片的功能。 为此做如下的处理: (1)自定义一个函数capturePicture执行拍照功能并将拍下的图片保存到文件中。 (2修改CameraContent组合函数调用capturePicture函数实现拍照并保存照片的功能。 fun capturePicture(cameraController:LifecycleCameraController,cameraExecutor:Executor){//创建文件名以img为开始扩展名为jpg的临时文件val file File.createTempFile(img,.jpg)//配置最新拍下照片文件的位置和元数据val outputFileOptions ImageCapture.OutputFileOptions.Builder(file).build()//定义拍照cameraExecutor处理拍照后的回调 object:ImageCapture.OnImageSavedCallback创建匿名对象对捕获图片保存cameraController.takePicture(outputFileOptions,cameraExecutor,object:ImageCapture.OnImageSavedCallback{override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {//拍照的图片成功保存的处理Log.d(CAMERA_APP,成功保存照片在${outputFileResults.savedUri})}override fun onError(exception: ImageCaptureException) {//拍照的图片保存失败的处理Log.d(CAMERA_APP,保存照片失败)}}) }修改CameraContent函数修改拍照的处理 OptIn(ExperimentalMaterial3Api::class) Composable private fun CameraContent() {val context LocalContext.currentval lifecycleOwner LocalLifecycleOwner.currentval cameraController remember{LifecycleCameraController(context)}//请求关联context的主线程的Excutorval cameraExecutor ContextCompat.getMainExecutor(context)Scaffold(modifier Modifier.fillMaxSize(),floatingActionButton {FloatingActionButton(onClick {//处理拍照capturePicture(cameraController,cameraExecutor)}) {Icon(modifier Modifier.clip(CircleShape).size(24.dp,24.dp),painter painterResource(id R.mipmap.len),contentDescription 照相机)}},floatingActionButtonPosition FabPosition.Center) { paddingValues: PaddingValues -Box(modifier Modifier.fillMaxSize()) {//在Compose中使用View系统中的PreviewViewAndroidView(modifier Modifier.fillMaxSize().padding(paddingValues),factory { context -PreviewView(context).apply {layoutParams LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)//设置背景颜色setBackgroundColor(Color.BLACK)//设置渲染模式implementationMode PreviewView.ImplementationMode.COMPATIBLE//设置缩放方式scaleType PreviewView.ScaleType.FILL_START}.also{it.controller cameraControllercameraController.bindToLifecycle(lifecycleOwner)}},onReset {},onRelease {cameraController.unbind()})}} }运行界面如上图所示。执行多次拍照后启动Android Studio的Device Explorer在data/data目录中找到创建的项目模块包名 在包名的下级目录cache中可以发现多次拍照的图片也可以根据跟踪日志发现保存图片文件的路径如下图所示。 参考文献 (1) ImageCapture.Builder https://developer.android.google.cn/reference/androidx/camera/core/ImageCapture.Builder#setIoExecutor(java.util.concurrent.Executor) (2)CameraX概览 https://developer.android.google.cn/training/camerax?hlzh-cn
http://www.w-s-a.com/news/167958/

相关文章:

  • 重庆忠县网站建设报价网页构建
  • 怎么自己做单页网站怎么在阿里做网站
  • 公司网站重新备案做电商没几个能赚钱的
  • 网站开发我们都能解决怎样做网站吸引客户
  • 网站首页图片切换代码wordpress minfy
  • 什么程序做网站收录好企业搭建网站的必要性
  • 建设网站主题建站必须要域名吗
  • 网站建设海报设计购物平台网站建设框架
  • 湖北在线网站建设建一个网站迈年
  • 上班自己花钱做的网站网站首页的动态怎么做
  • 台州网站建设哪家便宜沧州最新消息今天
  • 建设网站 请示 报告wordpress会员制
  • 青岛建网站人做网站怎么赚钱广告
  • 网站建设哪家好公司跨境电商展会2023
  • 设计大神云集的网站是南通市 网站设计
  • 心理咨询网站模板企业画册封面设计
  • 做网站 南京网站建设的重难点分析
  • 深圳做网站980移动网站开发语言
  • 网站评论怎么做seo关键词优化方法
  • 市级部门网站建设自评报告网站优化文章怎么做
  • 可不可以异地建设网站学做网站培训班要多少钱
  • 茌平网站建设公司免费的云服务器有哪些
  • 手机网站单页面铜陵网站制作公司
  • 网站logo怎么做才清晰千库网官网首页登录
  • 山西省建设银行网站首页长沙网站建设制作
  • 襄阳市做网站 优帮云百度搜索次数统计
  • 自己做视频直播网站盐城做网站多少钱
  • 买个网站服务器多少钱重庆做的好的房产网站
  • 深圳定制建站网站建设推广关键词怎么设置
  • 宝山网站建设 网站外包修改wordpress版权