安卓摇杆-多线程、canvas

安卓摇杆通过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);//画出来,drawCircle(x轴,y轴,半径,画笔)
		//摇杆中间背景
        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){//触摸位置在圆的1.5区域则执行
                    rockerData2.setX(event.getX());//改变摇杆中间控制点x轴
                    rockerData2.setY(event.getY());//改变摇杆中间控制点y轴
                }
                //左移动
                if(event.getX()>RX-Radius*1.5&&event.getX()<RX&&event.getY()>RY-Radius/3
                &&event.getY()<RY+Radius/3) {//触摸位置x轴在圆中心点和左边缘*1.5倍之间,并且y轴不能超出圆的三分之一
                    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){//触摸位置x轴在圆中心点和右边缘*1.5倍之间,并且y轴在圆的三分之一之内
                    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){//触摸位置y轴在圆中心点和上边缘*1.5倍之间,并且x轴在圆的三分之一之内
                    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){//触摸位置y轴在圆中心点和下边缘*1.5倍之间,并且轴不能超出圆的三分之一
                    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) {
            //isRunning是个布尔值当它等于true时就会循环执行,false则会结束线程
            //可以把isRunning放在类成员变量里,然后想要停止线程就改变值
                Long tm = System.currentTimeMillis();//这里获取当前时间值
                //这里可以插入画出摇杆那段代码
                Long now = System.currentTimeMillis();//获取执行后的时间值
                if ((now - tm) < sleepInt1) sleep(sleepInt1, now, tm);//控制每次执行60内
            }
        });
        thread1.start();
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修罗_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值