热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

树莓派小车3——安卓客户端

 项目地址https:github.comffmydreamWiCar界面做的很难看,美工方面实在不在行。重点是按钮触摸事件的处理,这里搬了RepeatListener项目代码,例

 项目地址 https://github.com/ffmydream/WiCar

界面做的很难看,美工方面实在不在行。

重点是按钮触摸事件的处理,这里搬了RepeatListener项目代码,例如:


leftButton.setOnTouchListener(
RepeatListener(300, 300, //两个参数,第一个参数:首次响应延时,即第一次响应和第二次响应的间隔时间,第二个参数:从第二次响应后,以后每次响应间隔时间
View.OnClickListener {
CoroutineScope(Dispatchers.IO).launch {
ch.send("car:left:100:")
}
})
)

 为左转按钮绑定监听,检测到左转按钮被按下,每隔300ms,持续发送"car:left:100:"给另一个socket协程。


CoroutineScope(Dispatchers.IO).launch {
try {
val os = Socket("192.168.1.166", 50000).getOutputStream()
val pw = PrintWriter(os)
while (true) {
pw.write(ch.receive())
pw.flush()
}
} catch (e: Exception) {
} finally {
}
}

上面这个是和socket通信,没有数据发送的时候,协程被挂起在ch.receive(),接收到数据,使用pw.write发送到tcp服务器

 

 

 


package com.example.wicar
import android.annotation.SuppressLint
import android.content.pm.ActivityInfo
import android.os.Bundle
import android.util.Log
import android.view.View
import android.webkit.WebChromeClient
import android.webkit.WebSettings
import android.webkit.WebViewClient
import android.widget.CompoundButton
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import java.io.PrintWriter
import java.net.Socket
object SrvAngle {
var hSrvAngle = 90
var vSrvAngle = 90
}
class MainActivity : AppCompatActivity() {
@SuppressLint("SetJavascriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val ch = Channel(0)
webView.settings.apply {
JavascriptEnabled = true
JavascriptCanOpenWindowsAutomatically = true
allowFileAccess = true // 设置允许访问文件数据
setSupportZoom(false)
builtInZoomCOntrols= true
cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
domStorageEnabled = true
databaseEnabled = true
useWideViewPort = true
loadWithOverviewMode = true
}
webView.webChromeClient = WebChromeClient()
webView.loadUrl("http://192.168.1.166:8081/")
camSwitch.setOnCheckedChangeListener { _, isChecked ->
CoroutineScope(Dispatchers.IO).launch {
if (isChecked) {
ch.send("cmd:sudo motion:0:")
} else {
ch.send("cmd:sudo pkill -KILL motion:0:")
}
}
}
CoroutineScope(Dispatchers.IO).launch {
try {
val os = Socket("192.168.1.166", 50000).getOutputStream()
val pw = PrintWriter(os)
while (true) {
pw.write(ch.receive())
pw.flush()
}
} catch (e: Exception) {
} finally {
}
}
leftButton.setOnTouchListener(
RepeatListener(300, 300,
View.OnClickListener {
CoroutineScope(Dispatchers.IO).launch {
ch.send("car:left:100:")
}
})
)
rightButton.setOnTouchListener(
RepeatListener(300, 300,
View.OnClickListener {
CoroutineScope(Dispatchers.IO).launch {
ch.send("car:right:100:")
}
})
)
forButton.setOnTouchListener(
RepeatListener(300, 300,
View.OnClickListener {
CoroutineScope(Dispatchers.IO).launch {
ch.send("car:for:100:")
}
})
)
backButton.setOnTouchListener(
RepeatListener(300, 300,
View.OnClickListener {
CoroutineScope(Dispatchers.IO).launch {
ch.send("car:back:100:")
}
})
)
srvLeftButton.setOnTouchListener(
RepeatListener(300, 50,
View.OnClickListener {
CoroutineScope(Dispatchers.IO).launch {
if (SrvAngle.hSrvAngle > 3)
SrvAngle.hSrvAngle = SrvAngle.hSrvAngle - 2
ch.send("srvo:horiz:${SrvAngle.hSrvAngle}:")
delay(5)
}
})
)
srvRightButton.setOnTouchListener(
RepeatListener(300, 50,
View.OnClickListener {
CoroutineScope(Dispatchers.IO).launch {
if (SrvAngle.hSrvAngle <177)
SrvAngle.hSrvAngle = SrvAngle.hSrvAngle + 2
ch.send("srvo:horiz:${SrvAngle.hSrvAngle}:")
delay(5)
}
})
)
srvUpButton.setOnTouchListener(
RepeatListener(300, 50,
View.OnClickListener {
CoroutineScope(Dispatchers.IO).launch {
if (SrvAngle.vSrvAngle <170)
SrvAngle.vSrvAngle = SrvAngle.vSrvAngle + 2
ch.send("srvo:vertic:${SrvAngle.vSrvAngle}:")
delay(5)
}
})
)
srvDownButton.setOnTouchListener(
RepeatListener(300, 50,
View.OnClickListener {
CoroutineScope(Dispatchers.IO).launch {
if (SrvAngle.vSrvAngle > 60)
SrvAngle.vSrvAngle = SrvAngle.vSrvAngle - 2
ch.send("srvo:vertic:${SrvAngle.vSrvAngle}:")
delay(5)
}
})
)
srvInitButton.setOnClickListener() {
CoroutineScope(Dispatchers.IO).launch {
ch.send("srv:init:0:")
}
}
}
}

 

本文地址:https://blog.csdn.net/ffmydream/article/details/108140128



推荐阅读
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文介绍了如何通过在数据库表中增加一个字段来记录文章的访问次数,并提供了一个示例方法用于更新该字段值。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 本文详细探讨了Android Activity中View的绘制流程和动画机制,包括Activity的生命周期、View的测量、布局和绘制过程以及动画对View的影响。通过实验验证,澄清了一些常见的误解,并提供了代码示例和执行结果。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 黑马头条项目:Vue 文章详情模块与交互功能实现
    本文详细介绍了如何在黑马头条项目中配置文章详情模块的路由、获取和展示文章详情数据,以及实现关注、点赞、不喜欢和评论功能。通过这些步骤,您可以全面了解如何开发一个完整的前端文章详情页面。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ... [详细]
  • 本文介绍了如何在iOS应用中自定义导航栏按钮,包括使用普通按钮和图片生成导航条专用按钮的方法。同时,探讨了在不同版本的iOS系统中实现多按钮布局的技术方案。 ... [详细]
author-avatar
要去治病啊8_r
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有