热门标签 | 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



推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
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社区 版权所有