Android如何实现360度摇杆
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章给大家分享的是有关Android如何实现360度摇杆的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。新建一个类。举例为MySurfaceViewpackage com
千家信息网最后更新 2025年01月19日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安全错误
数据库的锁怎样保障安全
druid监控数据库
怎么才能做网络安全员
php一次插入数据库
学网络安全就业怎么样
我的世界服务器需要登录吗
学软件开发的能做什么
网络安全三年级简单画
网络安全加固解决方案
大数据和软件开发那个好
web服务器 作用
思禾互联网科技怎么样
数据库事务安全性
数据库设计报告下载
关于大型数据库的关联规则
衢州电脑软件开发工具
2022年冬奥会重保网络安全
赌博游戏软件开发价格
网页出现500内部服务器错误
应用软件开发完后运营多少天
安庆市网络安全的例子
区块链平台软件开发
北京软件开发公司建设方案
浪潮服务器风扇噪音解决
删了数据库怎么找
原神国际服都玩什么服务器
企业微型服务器
web程序发布到服务器的流程
上海 软件开发培训
图书馆预约需要数据库吗
linux查看服务器端口是否通