Android | 自定义摇杆控件
控件已开源,gitee项目地址:https://gitee.com/y141111/RockerView
先看实现的功能,如不能满足需求,不必浪费宝贵的时间继续阅读
Android摇杆控件
- 功能
- 实现的监听功能
- 方向模式
- 用法
- 准备工作
- 八方向示例
- 1).添加方向监听(方向发生改变触发)
- 2).添加角度监听(角度发生改变触发)
- 3).添加距离监听(距离发生改变触发)
- 四方向示例
- 1).添加方向监听(方向发生改变触发)
- 2).添加角度监听,角度发生改变触发
- 3).添加距离监听(距离发生改变触发)
- 源代码
功能
xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".ControlEp"><TextViewandroid:id="@+id/msg"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/show"android:layout_width="wrap_content"android:layout_height="wrap_content"/><com.shy.rockerview.MyRockerViewandroid:id="@+id/rocker_view"android:layout_width="wrap_content"android:layout_height="wrap_content"app:rockerSpeedLevel="10"app:rockerCallBackMode="CALL_BACK_MODE_STATE_CHANGE"app:rockerScale="0.5"/><Buttonandroid:id="@+id/startReceiver"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/stopReceiver"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</LinearLayout>
java:
class MainActivity : AppCompatActivity() {companion object {const val TAG = "MainActivity"}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val mRockerViewXY = findViewById<MyRockerView>(R.id.rockerXY_View) // 1val mRockerViewZ = findViewById<MyRockerView>(R.id.rockerZ_View) // 2val directionXY_Text = findViewById<TextView>(R.id.directionXY_Text) // 1当前方向val angleXY_Text = findViewById<TextView>(R.id.angleXY_Text) // 1当前角度val levelXY_Text = findViewById<TextView>(R.id.levelXY_Text) // 1当前偏移级别val directionZ_Text = findViewById<TextView>(R.id.directionZ_Text) // 2当前方向val angleZ_Text = findViewById<TextView>(R.id.angleZ_Text) // 2当前角度val levelZ_Text = findViewById<TextView>(R.id.levelZ_Text) // 2当前偏移级别// 1mRockerViewXY.setOnShakeListener(MyRockerView.DirectionMode.DIRECTION_8, object : MyRockerView.OnShakeListener {override fun onStart() {}override fun direction(direction: MyRockerView.Direction) {var directionXY = ""when (direction) {MyRockerView.Direction.DIRECTION_CENTER -> {directionXY = "当前方向:中心"angleXY_Text.text = "当前方向:"levelXY_Text.text = "当前偏移级别:"}MyRockerView.Direction.DIRECTION_DOWN -> {directionXY = "当前方向:下"}MyRockerView.Direction.DIRECTION_LEFT -> {directionXY = "当前方向:左"}MyRockerView.Direction.DIRECTION_UP -> {directionXY = "当前方向:上"}MyRockerView.Direction.DIRECTION_RIGHT -> {directionXY = "当前方向:右"}MyRockerView.Direction.DIRECTION_DOWN_LEFT -> {directionXY = "当前方向:左下"}MyRockerView.Direction.DIRECTION_DOWN_RIGHT -> {directionXY = "当前方向:右下"}MyRockerView.Direction.DIRECTION_UP_LEFT -> {directionXY = "当前方向:左上"}MyRockerView.Direction.DIRECTION_UP_RIGHT -> {directionXY = "当前方向:右上"}}Log.e(TAG, "XY轴$directionXY")Log.e(TAG, "-----------------------------------------------")directionXY_Text.text = directionXY}override fun onFinish() {}})// 1mRockerViewXY.setOnAngleChangeListener(object : MyRockerView.OnAngleChangeListener {override fun onStart() {}override fun angle(angle: Double) {var angleXY = ""angleXY = "当前角度:$angle"Log.e(TAG, "XY轴$angleXY")angleXY_Text.setText(angleXY)}override fun onFinish() {}})// 1mRockerViewXY.setOnDistanceLevelListener { level ->var levelXY = ""levelXY = "当前距离级别:$level"Log.e(TAG, "XY轴$levelXY")levelXY_Text.setText(levelXY)}// 2mRockerViewZ.setOnShakeListener(MyRockerView.DirectionMode.DIRECTION_4_ROTATE_45, object : MyRockerView.OnShakeListener {override fun onStart() {}override fun direction(direction: MyRockerView.Direction) {var directionXY = ""when (direction) {MyRockerView.Direction.DIRECTION_CENTER -> {directionXY = "当前方向:中心"angleZ_Text.text = "当前方向:"levelZ_Text.text = "当前偏移级别:"}MyRockerView.Direction.DIRECTION_DOWN -> {directionXY = "当前方向:下"}MyRockerView.Direction.DIRECTION_LEFT -> {directionXY = "当前方向:左"}MyRockerView.Direction.DIRECTION_UP -> {directionXY = "当前方向:上"}MyRockerView.Direction.DIRECTION_RIGHT -> {directionXY = "当前方向:右"}else -> {}}Log.e(TAG, "XY轴$directionXY")Log.e(TAG, "-----------------------------------------------")directionZ_Text.text = directionXY}override fun onFinish() {}})// 2mRockerViewZ.setOnAngleChangeListener(object : MyRockerView.OnAngleChangeListener {override fun onStart() {}override fun angle(angle: Double) {var angleXY = ""angleXY = "当前角度:$angle"Log.e(TAG, "XY轴$angleXY")angleZ_Text.setText(angleXY)}override fun onFinish() {}})// 2mRockerViewZ.setOnDistanceLevelListener { level ->var levelXY = ""levelXY = "当前距离级别:$level"Log.e(TAG, "XY轴$levelXY")levelZ_Text.setText(levelXY)}}
}
实现的监听功能
1.摇杆方向监听
2.摇杆摇动角度监听
3.摇杆摇动距离监听
方向模式
实现了摇杆的五中方向模式
DIRECTION_2_HORIZONTAL,// 横向 左右两个方向
DIRECTION_2_VERTICAL, // 纵向 上下两个方向
DIRECTION_4_ROTATE_0, // 四个方向
DIRECTION_4_ROTATE_45, // 四个方向 旋转45度
DIRECTION_8 // 八个方向
用法
准备工作
1.在project的build.gradle中添加
allprojects {repositories {...maven { url 'https://jitpack.io' }}}
2.在module的build.gradle中添加
dependencies {implementation 'com.gitee.y141111:RockerView:1.0.0'}
3.xml中添加
<com.shy.rockerview.MyRockerViewandroid:id="@+id/rocker_view"android:layout_width="wrap_content"android:layout_height="wrap_content"app:areaBackground="@color/white"app:rockerBackground="@color/black"app:rockerSpeedLevel="10"app:rockerCallBackMode="CALL_BACK_MODE_STATE_CHANGE"app:rockerScale="0.5"/>
areaBackground 设置区域背景
rockerBackground 设置摇杆样式
rockerScale 设置摇杆的相对于背景的比例
rockerSpeedLevel 设置当前位置相对于中心点的距离的比例
rockerCallBackMode 有变化就回调,或者是方向改变才会回调
4.在Activity中添加
八方向示例
1).添加方向监听(方向发生改变触发)
MyRockerView rockerView = binding.rockerView;rockerView.setOnShakeListener(MyRockerView.DirectionMode.DIRECTION_8, new MyRockerView.OnShakeListener() {@Overridepublic void onStart() {}@Overridepublic void direction(MyRockerView.Direction direction) {switch (direction){case DIRECTION_CENTER:// 中心方向触发事件,一般归零break;case DIRECTION_UP:// 上 触发事件break;case DIRECTION_UP_RIGHT:// 上右 触发事件break;case DIRECTION_RIGHT:break;case DIRECTION_DOWN_RIGHT:break;case DIRECTION_DOWN:break;case DIRECTION_DOWN_LEFT:break;case DIRECTION_LEFT:break;case DIRECTION_UP_LEFT:break;}}@Overridepublic void onFinish() {}});
2).添加角度监听(角度发生改变触发)
rockerView.setOnAngleChangeListener(new MyRockerView.OnAngleChangeListener() {@Overridepublic void onStart() {}@Overridepublic void angle(double angle) {// 角度发生改变 触发事件 当前角度 angle}@Overridepublic void onFinish() {}});
3).添加距离监听(距离发生改变触发)
rockerView.setOnDistanceLevelListener(new MyRockerView.OnDistanceLevelListener() {@Overridepublic void onDistanceLevel(int level) {// 距中心点距离发生改变 触发事件}});
四方向示例
旋转45度才是正常情况下使用的四方向
1).添加方向监听(方向发生改变触发)
MyRockerView rockerView = binding.rockerView;rockerView.setOnShakeListener(MyRockerView.DirectionMode.DIRECTION_4_ROTATE_45, new MyRockerView.OnShakeListener() {@Overridepublic void onStart() {}@Overridepublic void direction(MyRockerView.Direction direction) {switch (direction){case DIRECTION_CENTER:// 中心方向触发事件,一般归零break;case DIRECTION_UP:// 上 触发事件break;case DIRECTION_RIGHT:// 右 触发事件break;case DIRECTION_DOWN:// 下 触发事件break;case DIRECTION_LEFT:// 左 触发事件break;}}@Overridepublic void onFinish() {}});
2).添加角度监听,角度发生改变触发
rockerView.setOnAngleChangeListener(new MyRockerView.OnAngleChangeListener() {@Overridepublic void onStart() {}@Overridepublic void angle(double angle) {// 角度发生改变 触发事件 当前角度 angle}@Overridepublic void onFinish() {}});
3).添加距离监听(距离发生改变触发)
rockerView.setOnDistanceLevelListener(new MyRockerView.OnDistanceLevelListener() {@Overridepublic void onDistanceLevel(int level) {// 距中心点距离发生改变 触发事件}});
角度和距离发生改变触发的是相同的监听事件
源代码
控件已开源,gitee项目地址:https://gitee.com/y141111/RockerView
Android | 自定义摇杆控件相关推荐
- Android自定义view摇杆,Android 自定义摇杆控件(使用图片)
效果图 1.找两张图片 1)Joystick背景图片circle_1.png 2)Joystick图片circle_2.png 2.在layout中创建布局文件 imagejoystick.xml 内 ...
- Android 自定义组合控件小结
Android 自定义组合控件小结 引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控 ...
- android自定义table,Android 自定义表格控件
Android 自定义表格控件 发布时间:2018-08-20 17:07, 浏览次数:487 , 标签: Android 1.简介 tabview是一款开源表格控件,可以通过xml属性设置行列数.设 ...
- Android自定义时间控件不可选择未来时间
本文出自:http://blog.csdn.net/dt235201314/article/details/78718066 Android自定义时间控件选择开始时间到结束时间 Android自定义时 ...
- Android自定义组合控件--EditText和Button组合成带有清空EditText内容功能的复合控件
目标:实现EditText和Button组合成带有清空EditText内容功能的复合控件,可以通过代码设置自定义控件的相关属性. 实现效果为: (1)在res/layout目录下编写自定义组合控件的布 ...
- android 自定义switch控件,Android中switch自定义样式
android 原生开关按钮控件 Switch 提供样式自定义方式,可供我们修改为适合我们开发使用的样式控件,自定义样式过程如下: 自定义switch切换drawable 新建swith_thumb. ...
- android 自定义view控件,Android 自定义View——自定义View控件
Android给我们提供了大量的View控件,但这还是远远满足不了我们的要求,有时候开发所需要的控件形式是在Android提供的控件中是不存在,这就需要我们自己去定义一个.那么如何自定义控件? 学习自 ...
- android身高控件_RuleView Android 自定义标尺控件(选择身高、体重等) @codeKK Android开源站...
尺子刻度 -- 自定义 view 自定义 view 学习(第一章) 1.自定义刻度尺控件 在我们想要获取用户的身高体重等信息时,直接让他们输入显然不够友好偶然看到一款 App 用了类似刻度尺的界面让用 ...
- android 自定义ImageView控件实现圆形图片-适用于用户头像
android开发中常常涉及到一种情况,就是将用户上传的图片以圆形样式显示,但是用户上传的图片可以有直角.圆角.正方形等多种不确定样式,这时就用到了自定义ImageView控件,在安卓客户端使接收到的 ...
最新文章
- linux如何用vi编程,vi使用方法
- 干掉 Postman?测试接口直接生成 API 文档,这工具真香!
- Nginx的rewrite之if指令(一)
- 部署用于生产的Exceptionlees(一个强大易用的日志收集服务)
- Java 13:切换表达式的增强功能
- 使用openssh-clients的scp命令来传输文件
- (83)FPGA时钟抖动和时钟偏斜-面试必问(七)(第17天)
- 动态规划算法实验报告_搞懂这几点,动态规划算法就是那么简单
- linux系统写一个脚本,编写一个简单的linuxshell脚本
- c语言中定义宏的利与弊
- Python Imaging Library: ImageColor Module(图像颜色模块)
- SQL Server还原和一些小发现
- php7对redis的扩展及redis主从搭建
- android camera实例
- 关于2022年度深圳市技术攻关重大项目的申报通知
- linux下ab压力测试工具
- 上班族时间自由,做什么副业合适?最好是在手机或电脑上的副业?
- springboot集成微信支付普通商户版之H5支付
- 服务器如何修改vt,如何设置VT?
- 无人驾驶入门——2D检测 基于图片的检测算法(四)
热门文章
- ArcGIS API for JavaScript :简介与快速上手
- c++的ThreadPool,OpenHarmony源码实现版赏析和使用
- 推荐模型的案例分析-【突破瓶颈期和bad case study】-- 编辑中
- 点击链接跳转到新页面并显示对应的tab标签页切换
- An Overview of C# 4.0
- SAP FB50 由操作习惯引起的 财务凭证-成本中心-功能范围 异常
- Guitar Pro新手教程
- 手机显示网关服务器未开,小森生活无可用网关服务器怎么回事?无可用网关服务器解决方法[多图]...
- 强烈DISS pyshark
- [042] 微信公众帐号开发教程第18篇-应用实例之音乐搜索