控件已开源,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 | 自定义摇杆控件相关推荐

  1. Android自定义view摇杆,Android 自定义摇杆控件(使用图片)

    效果图 1.找两张图片 1)Joystick背景图片circle_1.png 2)Joystick图片circle_2.png 2.在layout中创建布局文件 imagejoystick.xml 内 ...

  2. Android 自定义组合控件小结

    Android 自定义组合控件小结 引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控 ...

  3. android自定义table,Android 自定义表格控件

    Android 自定义表格控件 发布时间:2018-08-20 17:07, 浏览次数:487 , 标签: Android 1.简介 tabview是一款开源表格控件,可以通过xml属性设置行列数.设 ...

  4. Android自定义时间控件不可选择未来时间

    本文出自:http://blog.csdn.net/dt235201314/article/details/78718066 Android自定义时间控件选择开始时间到结束时间 Android自定义时 ...

  5. Android自定义组合控件--EditText和Button组合成带有清空EditText内容功能的复合控件

    目标:实现EditText和Button组合成带有清空EditText内容功能的复合控件,可以通过代码设置自定义控件的相关属性. 实现效果为: (1)在res/layout目录下编写自定义组合控件的布 ...

  6. android 自定义switch控件,Android中switch自定义样式

    android 原生开关按钮控件 Switch 提供样式自定义方式,可供我们修改为适合我们开发使用的样式控件,自定义样式过程如下: 自定义switch切换drawable 新建swith_thumb. ...

  7. android 自定义view控件,Android 自定义View——自定义View控件

    Android给我们提供了大量的View控件,但这还是远远满足不了我们的要求,有时候开发所需要的控件形式是在Android提供的控件中是不存在,这就需要我们自己去定义一个.那么如何自定义控件? 学习自 ...

  8. android身高控件_RuleView Android 自定义标尺控件(选择身高、体重等) @codeKK Android开源站...

    尺子刻度 -- 自定义 view 自定义 view 学习(第一章) 1.自定义刻度尺控件 在我们想要获取用户的身高体重等信息时,直接让他们输入显然不够友好偶然看到一款 App 用了类似刻度尺的界面让用 ...

  9. android 自定义ImageView控件实现圆形图片-适用于用户头像

    android开发中常常涉及到一种情况,就是将用户上传的图片以圆形样式显示,但是用户上传的图片可以有直角.圆角.正方形等多种不确定样式,这时就用到了自定义ImageView控件,在安卓客户端使接收到的 ...

最新文章

  1. linux如何用vi编程,vi使用方法
  2. 干掉 Postman?测试接口直接生成 API 文档,这工具真香!
  3. Nginx的rewrite之if指令(一)
  4. 部署用于生产的Exceptionlees(一个强大易用的日志收集服务)
  5. Java 13:切换表达式的增强功能
  6. 使用openssh-clients的scp命令来传输文件
  7. (83)FPGA时钟抖动和时钟偏斜-面试必问(七)(第17天)
  8. 动态规划算法实验报告_搞懂这几点,动态规划算法就是那么简单
  9. linux系统写一个脚本,编写一个简单的linuxshell脚本
  10. c语言中定义宏的利与弊
  11. Python Imaging Library: ImageColor Module(图像颜色模块)
  12. SQL Server还原和一些小发现
  13. php7对redis的扩展及redis主从搭建
  14. android camera实例
  15. 关于2022年度深圳市技术攻关重大项目的申报通知
  16. linux下ab压力测试工具
  17. 上班族时间自由,做什么副业合适?最好是在手机或电脑上的副业?
  18. springboot集成微信支付普通商户版之H5支付
  19. 服务器如何修改vt,如何设置VT?
  20. 无人驾驶入门——2D检测 基于图片的检测算法(四)

热门文章

  1. ArcGIS API for JavaScript :简介与快速上手
  2. c++的ThreadPool,OpenHarmony源码实现版赏析和使用
  3. 推荐模型的案例分析-【突破瓶颈期和bad case study】-- 编辑中
  4. 点击链接跳转到新页面并显示对应的tab标签页切换
  5. An Overview of C# 4.0
  6. SAP FB50 由操作习惯引起的 财务凭证-成本中心-功能范围 异常
  7. Guitar Pro新手教程
  8. 手机显示网关服务器未开,小森生活无可用网关服务器怎么回事?无可用网关服务器解决方法[多图]...
  9. 强烈DISS pyshark
  10. [042] 微信公众帐号开发教程第18篇-应用实例之音乐搜索