├── .gitignore
├── README.md
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── wangyongyao1989
│ │ └── joystickview
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── wangyongyao1989
│ │ │ └── joystickview
│ │ │ ├── MainActivity.java
│ │ │ └── views
│ │ │ └── GameJoystickView.java
│ └── res
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ ├── ic_launcher_background.xml
│ │ ├── image_connect_status_dot.png
│ │ ├── joystick.gif
│ │ ├── nav_icon_arrow_left_nor.png
│ │ ├── nav_icon_arrow_left_pre.png
│ │ ├── nav_icon_arrow_right_nor.png
│ │ ├── nav_icon_arrow_right_pre.png
│ │ ├── widget_bg_joystick.png
│ │ ├── widget_image_joystick_center_nor.png
│ │ ├── widget_image_joystick_center_pre.png
│ │ ├── widget_image_joystick_down_nor.png
│ │ ├── widget_image_joystick_down_pre.png
│ │ ├── widget_image_joystick_left_nor.png
│ │ ├── widget_image_joystick_left_pre.png
│ │ ├── widget_image_joystick_right_nor.png
│ │ ├── widget_image_joystick_right_pre.png
│ │ ├── widget_image_joystick_up_nor.png
│ │ └── widget_image_joystick_up_pre.png
│ │ ├── layout
│ │ └── activity_main.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── wangyongyao1989
│ └── joystickview
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── joystick.gif
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # JoystickView
2 | ## GamepadView、JostickView仿创客工场中的遥感的自定义View
3 | * 首先自定义View的三大步骤 onMeasure()、onDraw()、onLayout(),在此控件中放置对应的图片即可实现。onLayout的放置似乎没有什么必要,
4 | 最主要的是onDraw绘制出控件。
5 | * 绘制出控件接下来就是onTouchEvent()对手势的事件进行处理,包含中心遥感随着手势的点击、拖动实时位置的变化,手势释放时中心遥感回到原始位置。
6 | * 以上处理完之后就是逻辑的处理了,根据手势的事件在View所表现出来的坐标计算出对应的方向并与方向箭头挂上关系。
7 | # 效果展示:
8 | 
9 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 26
5 | defaultConfig {
6 | applicationId "com.wangyongyao1989.joystickview"
7 | minSdkVersion 19
8 | targetSdkVersion 26
9 | versionCode 1
10 | versionName "1.0"
11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
12 | }
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
17 | }
18 | }
19 | }
20 |
21 | dependencies {
22 | implementation fileTree(dir: 'libs', include: ['*.jar'])
23 | implementation 'com.android.support:appcompat-v7:26.1.0'
24 | implementation 'com.android.support.constraint:constraint-layout:1.1.2'
25 | testImplementation 'junit:junit:4.12'
26 | androidTestImplementation 'com.android.support.test:runner:1.0.2'
27 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
28 | }
29 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/wangyongyao1989/joystickview/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.wangyongyao1989.joystickview;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.*;
11 |
12 | /**
13 | * Instrumented test, which will execute on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() throws Exception {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.wangyongyao1989.joystickview", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/wangyongyao1989/joystickview/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.wangyongyao1989.joystickview;
2 |
3 | import android.support.v7.app.AppCompatActivity;
4 | import android.os.Bundle;
5 | import android.util.Log;
6 |
7 | import com.wangyongyao1989.joystickview.views.GameJoystickView;
8 |
9 | public class MainActivity extends AppCompatActivity {
10 |
11 | private static final String TAG = MainActivity.class.getName();
12 | private GameJoystickView mJoystickView;
13 |
14 | @Override
15 | protected void onCreate(Bundle savedInstanceState) {
16 | super.onCreate(savedInstanceState);
17 | setContentView(R.layout.activity_main);
18 | initView();
19 | initData();
20 | initEvent();
21 | }
22 |
23 | private void initEvent() {
24 | mJoystickView.setOnJoystickMoveListener(new GameJoystickView.OnJoystickMoveListener() {
25 | @Override
26 | public void onValueChanged(int angle, int power, int direction) {
27 | switch (direction) {
28 | case GameJoystickView.UP_DIRECTION:{
29 | Log.e(TAG,"向前");
30 | }
31 | break;
32 | case GameJoystickView.LEFT_DIRECTION :{
33 | Log.e(TAG,"向左");
34 |
35 | }
36 | break;
37 | case GameJoystickView.DOWN_DIRECTION:{
38 | Log.e(TAG,"向后");
39 |
40 | }
41 | break;
42 | case GameJoystickView.RIGHT_DIRECTION :{
43 | Log.e(TAG,"向右");
44 |
45 | }
46 | break;
47 |
48 | default: {
49 |
50 | }
51 | break;
52 | }
53 | }
54 | },GameJoystickView.DEFAULT_LOOP_INTERVAL);
55 | }
56 |
57 | private void initData() {
58 |
59 | }
60 |
61 | private void initView() {
62 | mJoystickView = findViewById(R.id.joystick_view);
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/app/src/main/java/com/wangyongyao1989/joystickview/views/GameJoystickView.java:
--------------------------------------------------------------------------------
1 | package com.wangyongyao1989.joystickview.views;
2 |
3 | import android.content.Context;
4 | import android.graphics.Bitmap;
5 | import android.graphics.BitmapFactory;
6 | import android.graphics.Canvas;
7 | import android.graphics.Paint;
8 | import android.graphics.Rect;
9 | import android.support.annotation.Nullable;
10 | import android.util.AttributeSet;
11 | import android.util.Log;
12 | import android.view.MotionEvent;
13 | import android.view.View;
14 |
15 | import com.wangyongyao1989.joystickview.R;
16 |
17 | /**
18 | * @author wangyao
19 | * @package com.wangyongyao1989.joystickview.views
20 | * @describe TODO
21 | * @date 2018/8/3
22 | */
23 |
24 | public class GameJoystickView extends View {
25 |
26 | public final static long DEFAULT_LOOP_INTERVAL = 200; // 200 ms
27 | private final double RAD = 57.2957795; //1弧度=57.2957795°
28 |
29 | private final String TAG = GameJoystickView.class.getName();
30 | private Bitmap mJoystickBackground;
31 | private Bitmap mJoystickCenter;
32 | private Bitmap mJoystickCenterUP;
33 |
34 | private Paint mainCircle;
35 | private int mCenterX;
36 | private int mCenterY;
37 | private int mJoystickRadius;
38 | private Bitmap mJoystickCenterDown;
39 | private int mCenterPositionX = 0;
40 | private int mCenterPositionY = 0;
41 | private int mCenterRadius;
42 | private int mCenterNorH;
43 | private int mCenterNorW;
44 |
45 | private int mTouchPositionX;
46 | private int mTouchPositionY;
47 |
48 | private OnJoystickMoveListener onJoystickMoveListener; // Listener
49 | private long loopInterval = DEFAULT_LOOP_INTERVAL;
50 |
51 |
52 | public final static int VIEW_CENTER_CIRCLE = 0;
53 | public final static int UP_DIRECTION = -1; //上
54 | public final static int DOWN_DIRECTION = -2; //下
55 | public final static int LEFT_DIRECTION = -3; //左
56 | public final static int RIGHT_DIRECTION = -4; //右
57 |
58 |
59 | private int lastPower = 0;
60 | private int lastAngle = 0;
61 | private int[] angleArray = new int[] {0, 15, 35, 55, 75, 105, 125, 145, 165, 195,
62 | 215, 235, 255, 285, 305, 325, 345, 360};
63 |
64 | private Bitmap mArrowLeftNor, mArrowLeftPre, mArrowRightNor, mArrowRightPre,
65 | mArrowUpNor, mArrowUpPre,mArrowDownNor, mArrowDownPre, mArrowLeft, mArrowRight, mArrowUp, mArrowDown;
66 | private int mArrowH;
67 | private int mArrowW;
68 |
69 |
70 | public GameJoystickView(Context context) {
71 | super(context);
72 | initGameJoystickView(context);
73 | }
74 |
75 | public GameJoystickView(Context context, @Nullable AttributeSet attrs) {
76 | super(context, attrs);
77 | initGameJoystickView(context);
78 | }
79 |
80 | public GameJoystickView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
81 | super(context, attrs, defStyleAttr);
82 | initGameJoystickView(context);
83 | }
84 |
85 | /**
86 | * 遥感移动方向的监听
87 | */
88 | public interface OnJoystickMoveListener {
89 | void onValueChanged(int angle, int power, int direction);
90 | }
91 |
92 | public void setOnJoystickMoveListener(OnJoystickMoveListener listener,
93 | long repeatInterval) {
94 | this.onJoystickMoveListener = listener;
95 | this.loopInterval = repeatInterval;
96 | }
97 |
98 |
99 | private void initGameJoystickView(Context context) {
100 |
101 | //获取每种状态下的bitmap
102 | mJoystickBackground = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_bg_joystick);
103 | mJoystickCenter = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_center_nor);
104 | mJoystickCenterDown = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_center_pre);
105 | mJoystickCenterUP = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_center_nor);
106 |
107 | mArrowLeft = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_left_nor);
108 | mArrowRight = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_right_nor);
109 | mArrowUp= BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_up_nor);
110 | mArrowDown= BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_down_nor);
111 |
112 |
113 | mArrowLeftNor = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_left_nor);
114 | mArrowLeftPre = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_left_pre);
115 | mArrowRightNor = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_right_nor);
116 | mArrowRightPre = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_right_pre);
117 |
118 | mArrowUpNor= BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_up_nor);
119 | mArrowUpPre = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_up_pre);
120 | mArrowDownNor = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_down_nor);
121 | mArrowDownPre = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_image_joystick_down_pre);
122 |
123 | mArrowH = mArrowUpNor.getHeight();
124 | mArrowW = mArrowUpNor.getWidth();
125 |
126 | mCenterNorH = mJoystickCenter.getHeight();
127 | mCenterNorW = mJoystickCenter.getWidth();
128 |
129 | mCenterRadius = Math.max(mCenterNorH, mCenterNorW) / 5;
130 |
131 | mainCircle = new Paint(Paint.ANTI_ALIAS_FLAG);
132 |
133 |
134 | }
135 |
136 |
137 | @Override
138 | protected void onSizeChanged(int w, int h, int oldw, int oldh) {
139 | super.onSizeChanged(w, h, oldw, oldh);
140 |
141 | int d = Math.min(w, h);
142 | //控件中心位置坐标
143 | mCenterPositionX = (int) getWidth() / 2;
144 | mCenterPositionY = (int) getWidth() / 2;
145 | mTouchPositionX = mCenterPositionX;
146 | mTouchPositionY = mCenterPositionY;
147 | //获取整个控件矩形的边长的0.75倍
148 | mJoystickRadius = (int)( d/2 *0.75) ;
149 |
150 | }
151 |
152 | @Override
153 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
154 |
155 | int d = Math.min(measure(widthMeasureSpec), measure(heightMeasureSpec));
156 | setMeasuredDimension(d, d);
157 | }
158 |
159 | @Override
160 | protected void onDraw(Canvas canvas) {
161 | // super.onDraw(canvas);
162 | //获取view的中心点
163 | mCenterX = (getWidth()) / 2;
164 | mCenterY = (getHeight()) / 2;
165 |
166 | //canvas出背景图片
167 | canvas.drawBitmap(mJoystickBackground,null,new Rect(
168 | (mCenterX - mJoystickRadius),
169 | (mCenterY - mJoystickRadius),
170 | (mCenterX + mJoystickRadius),
171 | (mCenterY + mJoystickRadius)
172 | ),mainCircle);
173 |
174 | //朝上箭头
175 | canvas.drawBitmap(mArrowUp,null, new Rect(
176 | (mCenterX - mArrowW /4),
177 | (int) ((mCenterY - mJoystickRadius * 0.8) - mArrowH/4),
178 | (mCenterX + mArrowW/4),
179 | (int) ((mCenterY - mJoystickRadius * 0.8) + mArrowH/4)
180 | ),mainCircle);
181 |
182 | canvas.drawBitmap(mArrowDown,null, new Rect(
183 | (mCenterX - mArrowW /4),
184 | (int) ((mCenterY + mJoystickRadius * 0.8) - mArrowH/4),
185 | (mCenterX + mArrowW/4),
186 | (int) ((mCenterY + mJoystickRadius * 0.8) + mArrowH/4)
187 | ),mainCircle);
188 |
189 | canvas.drawBitmap(mArrowLeft,null, new Rect(
190 | (int) ((mCenterX - mJoystickRadius *0.8) - mArrowW /4),
191 | (mCenterY - mArrowH/4),
192 | (int) ((mCenterX - mJoystickRadius *0.8) + mArrowW /4),
193 | (mCenterY + mArrowH/4)
194 | ),mainCircle);
195 |
196 | canvas.drawBitmap(mArrowRight,null, new Rect(
197 | (int) ((mCenterX + mJoystickRadius *0.8) - mArrowW /4),
198 | (mCenterY - mArrowH/4),
199 | (int) ((mCenterX + mJoystickRadius *0.8) + mArrowW /4),
200 | (mCenterY + mArrowH/4)
201 | ),mainCircle);
202 |
203 |
204 | mCenterPositionX = mTouchPositionX;
205 | mCenterPositionY = mTouchPositionY;
206 |
207 | //canvas出中心遥感的图片
208 | canvas.drawBitmap(mJoystickCenter,null,new Rect(
209 | (mCenterPositionX - mCenterNorW/5),
210 | (mCenterPositionY - mCenterNorH/5),
211 | (mCenterPositionX + mCenterNorW/5),
212 | (mCenterPositionY + mCenterNorH/5)
213 | ),mainCircle);
214 |
215 |
216 | }
217 |
218 | @Override
219 | public boolean onTouchEvent(MotionEvent event) {
220 |
221 | mTouchPositionX = (int) event.getX();
222 | mTouchPositionY = (int) event.getY();
223 |
224 | double sqrt = Math.sqrt((mTouchPositionX - mCenterX) * (mTouchPositionX - mCenterX) +
225 | (mTouchPositionY - mCenterY) * (mTouchPositionY - mCenterY));
226 | // Log.e(TAG,"sqrt;"+sqrt);
227 |
228 | if (sqrt > (mJoystickRadius - mCenterRadius) ) {
229 | mTouchPositionX = (int) ((mTouchPositionX - mCenterX )* (mJoystickRadius - mCenterRadius) / sqrt + mCenterX);
230 | mTouchPositionY = (int) ((mTouchPositionY - mCenterY) * (mJoystickRadius - mCenterRadius) / sqrt + mCenterY);
231 | }
232 | changeArrowState();
233 | invalidate();
234 | switch (event.getAction()) {
235 | case MotionEvent.ACTION_DOWN : {
236 | if (sqrt > mJoystickRadius) {
237 | mTouchPositionX = mCenterX;
238 | mTouchPositionY = mCenterY;
239 | return false;
240 | }else {
241 | mJoystickCenter = mJoystickCenterDown;
242 | invalidate();
243 | }
244 |
245 | }
246 | if (onJoystickMoveListener != null)
247 | onJoystickMoveListener.onValueChanged(getAngle(), getPower(), getFourDirection());
248 | break;
249 |
250 | case MotionEvent.ACTION_MOVE : {
251 |
252 | if (onJoystickMoveListener != null)
253 | onJoystickMoveListener.onValueChanged(getAngle(), getPower(), getFourDirection());
254 |
255 | }
256 | break;
257 |
258 | case MotionEvent.ACTION_UP : {
259 |
260 | mTouchPositionX = (int) mCenterX;
261 | mTouchPositionY = (int) mCenterY;
262 | mJoystickCenter = mJoystickCenterUP;
263 | mArrowUp = mArrowUpNor;
264 | mArrowDown = mArrowDownNor;
265 | mArrowLeft = mArrowLeftNor;
266 | mArrowRight = mArrowRightNor;
267 | invalidate();
268 | if (onJoystickMoveListener != null)
269 | onJoystickMoveListener.onValueChanged(getAngle(), getPower(), getFourDirection());
270 | }
271 | break;
272 | }
273 |
274 | return true;
275 | }
276 |
277 | /**
278 | * 改变箭头显示状态
279 | */
280 | private void changeArrowState() {
281 | if (getFourDirection() == UP_DIRECTION ) {
282 | mArrowUp = mArrowUpPre;
283 | mArrowDown = mArrowDownNor;
284 | mArrowLeft = mArrowLeftNor;
285 | mArrowRight = mArrowRightNor;
286 | }else if (getFourDirection() == DOWN_DIRECTION) {
287 | mArrowDown = mArrowDownPre;
288 | mArrowUp = mArrowUpNor;
289 | mArrowLeft = mArrowLeftNor;
290 | mArrowRight = mArrowRightNor;
291 | }else if(getFourDirection() == LEFT_DIRECTION) {
292 | mArrowLeft = mArrowLeftPre;
293 | mArrowUp = mArrowUpNor;
294 | mArrowDown = mArrowDownNor;
295 | mArrowRight = mArrowRightNor;
296 | }else if (getFourDirection() == RIGHT_DIRECTION) {
297 | mArrowRight = mArrowRightPre;
298 | mArrowUp = mArrowUpNor;
299 | mArrowDown = mArrowDownNor;
300 | mArrowLeft = mArrowLeftNor;
301 | }
302 | }
303 |
304 |
305 | /**
306 | * 返回四个方向的值
307 | * @return
308 | */
309 | private int getFourDirection() {
310 | int direction = VIEW_CENTER_CIRCLE;
311 | lastPower = getPower();
312 | if (lastPower <= 33 ) {
313 | return direction;
314 | }
315 | int a = 0;
316 | if (lastAngle <= 0) {
317 | a = (lastAngle * -1) + 90;
318 | } else if (lastAngle > 0) {
319 | if (lastAngle <= 90) {
320 | a = 90 - lastAngle;
321 | } else {
322 | a = 360 - (lastAngle - 90);
323 | }
324 | }
325 | int arraylength = angleArray.length;
326 | for (int i = 1; i < arraylength; i++) {
327 | if (a >= angleArray[i-1] && a < angleArray[i]) {
328 | direction = i % (arraylength - 1);
329 | if (direction == 0) {
330 | direction++;
331 | }
332 | break;
333 | }
334 | }
335 | Log.e(TAG,"direction:"+direction);
336 | if (direction > 3 && direction <= 5) {
337 | return UP_DIRECTION;
338 | }else if (direction > 5 && direction <=10) {
339 | return LEFT_DIRECTION;
340 | }else if (direction > 10 && direction <= 15) {
341 | return DOWN_DIRECTION;
342 | }else if ((direction > 0 && direction <= 3) || ((direction > 15 && direction <= 16))) {
343 | return RIGHT_DIRECTION;
344 | }else {
345 | return 0;
346 | }
347 | }
348 |
349 | /**
350 | * 手势移动的半径值(相对于View中心点)与背景图案半径的比值
351 | * @return
352 | */
353 | private int getPower() {
354 | return (int) (100 * Math.sqrt((mTouchPositionX - mCenterX) * (mTouchPositionX - mCenterX) +
355 | (mTouchPositionY - mCenterY) * (mTouchPositionY - mCenterY)) / mJoystickRadius);
356 | }
357 |
358 | /**
359 | * 通过坐标获取角度值(反正切值 * 弧度 = 角度)
360 | * @return
361 | */
362 | private int getAngle() {
363 | if (mTouchPositionX > mCenterX) {
364 | if (mTouchPositionY < mCenterY) {
365 | return lastAngle = (int) (Math.atan((mTouchPositionY - mCenterY) / (mTouchPositionX - mCenterX)) * RAD + 90);
366 | } else if (mTouchPositionY > mCenterY) {
367 | return lastAngle = (int) (Math.atan((mTouchPositionY - mCenterY) / (mTouchPositionX - mCenterX)) * RAD) + 90;
368 | } else {
369 | return lastAngle = 90;
370 | }
371 | } else if (mTouchPositionX < mCenterX) {
372 | if (mTouchPositionY < mCenterY) {
373 | return lastAngle = (int) (Math.atan((mTouchPositionY - mCenterY) / (mTouchPositionX - mCenterX)) * RAD - 90);
374 | } else if (mTouchPositionY > mCenterY) {
375 | return lastAngle = (int) (Math.atan((mTouchPositionY - mCenterY) / (mTouchPositionX - mCenterX)) * RAD) - 90;
376 | } else {
377 | return lastAngle = -90;
378 | }
379 | } else {
380 | if (mTouchPositionY <= mCenterY) {
381 | return lastAngle = 0;
382 | } else {
383 | if (lastAngle < 0) {
384 | return lastAngle = -180;
385 | } else {
386 | return lastAngle = 180;
387 | }
388 | }
389 | }
390 | }
391 |
392 |
393 | /**
394 | * 控件测量的设置
395 | * @param measureSpec
396 | * @return
397 | */
398 | private int measure(int measureSpec) {
399 | int result = 0;
400 |
401 | // Decode the measurement specifications.
402 | int specMode = MeasureSpec.getMode(measureSpec);
403 | int specSize = MeasureSpec.getSize(measureSpec);
404 |
405 | if (specMode == MeasureSpec.UNSPECIFIED) {
406 | // Return a default size of 200 if no bounds are specified.
407 | result = 200;
408 | } else {
409 | // As you want to fill the available space
410 | // always return the full available bounds.
411 | result = specSize;
412 | }
413 | return result;
414 | }
415 |
416 | }
417 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/image_connect_status_dot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/image_connect_status_dot.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/joystick.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/joystick.gif
--------------------------------------------------------------------------------
/app/src/main/res/drawable/nav_icon_arrow_left_nor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/nav_icon_arrow_left_nor.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/nav_icon_arrow_left_pre.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/nav_icon_arrow_left_pre.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/nav_icon_arrow_right_nor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/nav_icon_arrow_right_nor.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/nav_icon_arrow_right_pre.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/nav_icon_arrow_right_pre.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/widget_bg_joystick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/widget_bg_joystick.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/widget_image_joystick_center_nor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/widget_image_joystick_center_nor.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/widget_image_joystick_center_pre.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/widget_image_joystick_center_pre.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/widget_image_joystick_down_nor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/widget_image_joystick_down_nor.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/widget_image_joystick_down_pre.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/widget_image_joystick_down_pre.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/widget_image_joystick_left_nor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/widget_image_joystick_left_nor.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/widget_image_joystick_left_pre.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/widget_image_joystick_left_pre.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/widget_image_joystick_right_nor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/widget_image_joystick_right_nor.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/widget_image_joystick_right_pre.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/widget_image_joystick_right_pre.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/widget_image_joystick_up_nor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/widget_image_joystick_up_nor.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/widget_image_joystick_up_pre.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/drawable/widget_image_joystick_up_pre.png
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
15 |
16 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | JoystickView
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/test/java/com/wangyongyao1989/joystickview/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.wangyongyao1989.joystickview;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() throws Exception {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 |
5 | repositories {
6 | google()
7 | jcenter()
8 | }
9 | dependencies {
10 | classpath 'com.android.tools.build:gradle:3.0.1'
11 |
12 |
13 | // NOTE: Do not place your application dependencies here; they belong
14 | // in the individual module build.gradle files
15 | }
16 | }
17 |
18 | allprojects {
19 | repositories {
20 | google()
21 | jcenter()
22 | }
23 | }
24 |
25 | task clean(type: Delete) {
26 | delete rootProject.buildDir
27 | }
28 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 |
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
18 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/joystick.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangyongyao1989/JoystickView/ce1f06103aace139d985521e0e8adcef64dce1ff/joystick.gif
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------