Android如何实现360度摇杆
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章给大家分享的是有关Android如何实现360度摇杆的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。新建一个类。举例为MySurfaceViewpackage com
千家信息网最后更新 2026年11月01日Android如何实现360度摇杆
这篇文章给大家分享的是有关Android如何实现360度摇杆的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
新建一个类。举例为MySurfaceView
package com.example.blt;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.PorterDuff.Mode;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.SurfaceHolder.Callback;public class MySurfaceView extends SurfaceView implements Callback { private SurfaceHolder sfh; private Canvas canvas; private Paint paint; private int coordinate; // 固定摇杆背景圆形的半径 private int RockerCircleR, SmallRockerCircleR; // 摇杆的X,Y坐标以及摇杆的半径 private float SmallRockerCircleX, SmallRockerCircleY; private RudderListener listener = null; // 事件回调接口 public MySurfaceView(Context context) { super(context); } public MySurfaceView(Context context, AttributeSet as) { super(context, as); this.setKeepScreenOn(true); sfh = getHolder(); sfh.addCallback(this); paint = new Paint(); paint.setColor(Color.GREEN); paint.setAntiAlias(true);// 抗锯齿 setFocusable(true); setFocusableInTouchMode(true); setZOrderOnTop(true); sfh.setFormat(PixelFormat.TRANSPARENT);// 设置背景透明 } public void surfaceCreated(SurfaceHolder holder) { // 获得控件最小值 int little = this.getWidth() < this.getHeight() ? this.getWidth() : this.getHeight(); // 根据屏幕大小绘制 SmallRockerCircleX = SmallRockerCircleY = coordinate = little / 2; // 固定摇杆背景圆形的半径 RockerCircleR = (int) (little * 0.35); // 摇杆的半径 SmallRockerCircleR = (int) (little * 0.15); draw(); } /*** * 得到两点之间的弧度 */ public double getRad(float px1, float py1, float px2, float py2) { // 得到两点X的距离 float x = px2 - px1; // 得到两点Y的距离 float y = py1 - py2; // 算出斜边长 float xie = (float) Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); // 得到这个角度的余弦值(通过三角函数中的定理 :邻边/斜边=角度余弦值) float cosAngle = x / xie; // 通过反余弦定理获取到其角度的弧度 float rad = (float) Math.acos(cosAngle); // 注意:当触屏的位置Y坐标<摇杆的Y坐标我们要取反值-0~-180 if (py2 < py1) { rad = -rad; } return rad; } @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) { // 当触屏区域不在活动范围内 if (Math.sqrt(Math.pow((coordinate - (int) event.getX()), 2) + Math.pow((coordinate - (int) event.getY()), 2)) >= RockerCircleR) { // 得到摇杆与触屏点所形成的角度 double tempRad = getRad(coordinate, coordinate, event.getX(), event.getY()); // 保证内部小圆运动的长度限制 getXY(coordinate, coordinate, RockerCircleR, tempRad); } else {// 如果小球中心点小于活动区域则随着用户触屏点移动即可 SmallRockerCircleX = (int) event.getX(); SmallRockerCircleY = (int) event.getY(); } } else if (event.getAction() == MotionEvent.ACTION_UP) { // 当释放按键时摇杆要恢复摇杆的位置为初始位置 SmallRockerCircleX = coordinate; SmallRockerCircleY = coordinate; } draw(); if (listener != null) { listener.onSteeringWheelChanged((SmallRockerCircleX - coordinate) / RockerCircleR, (coordinate - SmallRockerCircleY) / RockerCircleR); } return true; } /** * * @param R * 圆周运动的旋转点 * @param centerX * 旋转点X * @param centerY * 旋转点Y * @param rad * 旋转的弧度 */ public void getXY(float centerX, float centerY, float R, double rad) { // 获取圆周运动的X坐标 SmallRockerCircleX = (float) (R * Math.cos(rad)) + centerX; // 获取圆周运动的Y坐标 SmallRockerCircleY = (float) (R * Math.sin(rad)) + centerY; } public void draw() { try { canvas = sfh.lockCanvas(); // canvas.drawColor(Color.WHITE); canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);// 清除屏幕 // 设置透明度 paint.setColor(Color.CYAN); // 绘制摇杆背景 canvas.drawCircle(coordinate, coordinate, RockerCircleR, paint); paint.setColor(Color.RED); // 绘制摇杆 canvas.drawCircle(SmallRockerCircleX, SmallRockerCircleY, SmallRockerCircleR, paint); } catch (Exception e) { // TODO: handle exception } finally { try { if (canvas != null) sfh.unlockCanvasAndPost(canvas); } catch (Exception e2) { } } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceDestroyed(SurfaceHolder holder) { } // 设置回调接口 public void setRudderListener(RudderListener rockerListener) { listener = rockerListener; } // 回调接口 public interface RudderListener { void onSteeringWheelChanged(float cross, float longitudinal); }}主窗体中
package com.example.blt;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class ControlActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_control); MySurfaceView temp = (MySurfaceView) findViewById(R.id.rudder); temp.setRudderListener(new MySurfaceView.RudderListener() { @Override public void onSteeringWheelChanged(float cross, float longitudinal) { // TODO Auto-generated method stub Log.v("change", "c" + cross + "l" + longitudinal); ((TextView) findViewById(R.id.textView2)).setText("c:" + cross + "l:" + longitudinal); } }); ((Button) findViewById(R.id.button2)) .setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. // getMenuInflater().inflate(R.menu.control, menu); return false; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }}----------------------主窗体XML
感谢各位的阅读!关于"Android如何实现360度摇杆"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
摇杆
坐标
半径
背景
角度
运动
圆周运动
位置
余弦
圆周
弧度
接口
内容
圆形
定理
屏幕
更多
窗体
篇文章
不错
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
科技创新与互联网经济
互联网科技深圳
互联网下的科技发展
中国 科技 互联网
现代科技和互联网有关系吗
恒银科技与互联网金融
互联网大会黑科技排名
广州恒生互联网科技有限
宁夏众和广鑫互联网科技有限公司
互联网对科技的发展
996高科技互联网公司
明优互联网科技有限公司
富国互联网科技002692
从那以后互联网科技有限公司
互联网科技融合创新
互联网风格科技公司名称
福仕德教育科技互联网
保山浩联互联网科技有限公司
互联网科技创业有什么好项目
高科技和互联网的现代国家
伟宏互联网科技
中关村互联网科技集团
九亚互联网科技
腾讯科技 互联网女皇
衡水科技产业互联网平台
湖南洣水互联网科技有限公司扣款
爱医互联网络科技
半导体行业属于互联网高科技类吗
容联科技互联网电商
互联网科技创新创业项目