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



推荐阅读
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
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社区 版权所有