安卓摇杆通过canvas和触摸监听实现
思路画两个大圆在里面画一个小圆,通过滑动监听控制小院位置
先定义一个RockerData类来保存圆坐标值和半径值
package com.jk.fishgame;
public class RockerData {
private float x,y;
public void setX(float x) {
this.x = x;
}
public void setY(float y) {
this.y = y;
}
public void setRadius(float radius) {
this.radius = radius;
}
private float radius;
public RockerData(float x, float y, float radius) {
this.x = x;
this.y = y;
this.radius = radius;
}
public float x() {
return x;
}
public float y() {
return y;
}
public float radius() {
return radius;
}
}
实例化对象存放坐标值和半径值
RockerData rockerData1=new RockerData(width/9,height-200-height/20,200);
RockerData rockerData2=new RockerData(width/9,height-200-height/20,40);
画出摇杆
Paint p1=new Paint();
p1.setColor(Color.parseColor("#8FE6E6FA"));
p1.setStyle(Paint.Style.STROKE);
p1.setStrokeWidth(width/200);
canvas.drawCircle(rockerData1.x(),rockerData1.y(),rockerData1.radius(),p1);
Paint p2=new Paint();
p2.setColor(Color.parseColor("#6BE6E6FA"));
canvas.drawCircle(rockerData1.x(),rockerData1.y(),rockerData1.radius(),p2);
Paint p3=new Paint();
p3.setColor(Color.parseColor("#8FE6E6FA"));
canvas.drawCircle(rockerData2.x(),rockerData2.y(),rockerData2.radius(),p3);
触摸监听
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN://按钮按下时操作
break;
case MotionEvent.ACTION_MOVE://手指放在屏幕上时一直执行
if(event.getX()>RX-Radius*1.5&&event.getX()<RX+Radius*1.5&&event.getY()>RY-Radius*1.5&&event.getY()<RY+Radius*1.5){
rockerData2.setX(event.getX());
rockerData2.setY(event.getY());
}
if(event.getX()>RX-Radius*1.5&&event.getX()<RX&&event.getY()>RY-Radius/3
&&event.getY()<RY+Radius/3) {
if (dirt == MyFish.direction.RIGHT)
transformImage();
dirt = MyFish.direction.LEFT;
fishX -= step;
if (fishX <=0) fishX = 0;
}
if(event.getX()>RX&&event.getX()<RX+Radius*1.5&&event.getY()>RY-Radius/3
&&event.getY()<RY+Radius/3){
if (dirt == MyFish.direction.LEFT)
transformImage();
dirt = MyFish.direction.RIGHT;
fishX += step;
if (fishX > MainView.screenW-bmpFish.getWidth()/15) fishX = MainView.screenW-bmpFish.getWidth()/15;
}
if(event.getY()>RY-Radius*1.5&&event.getY()<RY&&event.getX()>RX-Radius/3
&&event.getX()<RX+Radius/3){
fishY -= step;
if (fishY < 0) fishY = 0;
}
if(event.getY()>RY&&event.getY()<RY+Radius*1.5&&event.getX()>RX-Radius/3
&&event.getX()<RX+Radius/3){
fishY += step;
if (fishY > MainView.screenH) fishY = MainView.screenH - h;
}
break;
case MotionEvent.ACTION_UP:
rockerData2.setX(width/9);
rockerData2.setY(height-200-height/20);
break;
}
return true;
}
另外,需要把画图的操作放在线程里并且循环执行每60秒一次
这里给个线程,其他更多的细节,就不多说了,打代码好累。
thread1 = new Thread(() -> {
while (isRunning) {
Long tm = System.currentTimeMillis();
Long now = System.currentTimeMillis();
if ((now - tm) < sleepInt1) sleep(sleepInt1, now, tm);
}
});
thread1.start();