Почему мой массив byte [] возвращает ноль вместо позиции?

#java #android

#java #Android

Вопрос:

Я допустил несколько глупых ошибок в своем последнем посте, но я вернулся и чувствую, что у меня есть лучше отформатированный вопрос.

Я вызываю функцию с именем, getData() которая является byte[] возвращаемым типом, и отправляю ее через пакеты в другую программу. На стороне программы я получаю «98 0 0 101», который сообщает мне, что что-то не так с моими функциями bDrive.getX() и bDrive.getY() .

Эти функции являются производными от созданного мной класса Joystick, который отображает Вид и рисует джойстик.

Я попытался сохранить все в своей Mybot деятельности, кроме работы с сокетом.

 public class Mybot extends Activity {

Thread arduino;
ArduinoConnection socketThread;
Joystick bDrive;

public void onCreate(Bundle paramBundle)
{
    super.onCreate(paramBundle);
    setContentView(R.layout.activity_Mybot);
    socketThread = new ArduinoConnection(Mybot.this);
    arduino = new Thread( socketThread);
    arduino.start();

}

public byte[] getData() {

    bDrive = (Joystick)findViewById(R.id.bDrive); // I think this is the culprit

    byte[] arrayOfData = new byte[4];

    arrayOfData[0] = 98;
    arrayOfData[1] = (byte) bDrive.getX(); // Returns 0 
    arrayOfData[2] = (byte) bDrive.getY(); // Returns 0
    arrayOfData[3] = 101;

    return arrayOfData;
}
}
  

Я чувствую, что ошибка находится в findViewById() части моей getData() функции. Однако я обработал onTouch в своем классе Joystick, поэтому я не совсем понимаю, почему это может быть проблемой.

 public class ArduinoConnection implements Runnable {

    boolean sending = true;
    public static DatagramSocket socket;

    Mybot host;

    public ArduinoConnection(Mybot mini) {
        this.host = mini;
    }

    public void run() {

        try {

            socket = new DatagramSocket();
            InetAddress localInetAddress = InetAddress.getByName("192.168.10.104");
            socket.connect(localInetAddress, 61557);
            running = true;

            while (sending) {

                byte[] arrayOfByte = this.host.getData(); // Returning 98 0 0 101

                DatagramPacket localDatagramPacket = new DatagramPacket(arrayOfByte, arrayOfByte.length);
                try {
                    socket.send(localDatagramPacket);
                } catch (IOException localIOException) {
                }

                sending = true;
            }

            socket.close();

        } catch (UnknownHostException localUnknownHostException) {
            sending = false;
        } catch (SocketException e) {
            e.printStackTrace();
            sending = false;
        }

    }

}
  

Код Arduino прост.

Класс джойстика:

  public class Joystick extends View
{
    private Paint background;
    private String label = null;
    private Paint labelPaint;
    private boolean liftReset = true;
    private Paint line;
    private boolean locked = false;
    private float normX;
    private float normY;
    private int posX;
    private int posY;
    private Paint thumb;
    private int thumbRadius;

    public Joystick(Context paramContext)
    {
        super(paramContext);
    }

    public Joystick(Context paramContext, AttributeSet paramAttributeSet)
    {
        super(paramContext, paramAttributeSet);
        setupJoystick(paramContext, paramAttributeSet);
    }

    public Joystick(Context paramContext, AttributeSet paramAttributeSet, int paramInt)
    {
        super(paramContext, paramAttributeSet, paramInt);
        setupJoystick(paramContext, paramAttributeSet);
    }

    private int min(int paramInt1, int paramInt2)
    {
        if (paramInt1 <= paramInt2) {
            return paramInt1;
        }
        return paramInt2;
    }

    private void updateNormPos()
    {
        this.normX = (-(this.posX - getWidth() / 2) / (getWidth() / 2.0F - this.thumbRadius));
        this.normY = (-(this.posY - getHeight() / 2) / (getHeight() / 2.0F - this.thumbRadius));
    }

    public float getX()
    {
        return this.normX;
    }

    public float getY()
    {
        return this.normY;
    }


    protected Path octagon(int paramInt1, int paramInt2, int paramInt3)
    {
        Path localPath = new Path();
        localPath.moveTo(paramInt2, paramInt3   paramInt1);
        localPath.lineTo(paramInt2   0.866F * paramInt1, paramInt3   paramInt1 / 2);
        localPath.lineTo(paramInt2   0.866F * paramInt1, paramInt3 - paramInt1 / 2);
        localPath.lineTo(paramInt2, paramInt3 - paramInt1);
        localPath.lineTo(paramInt2 - 0.866F * paramInt1, paramInt3 - paramInt1 / 2);
        localPath.lineTo(paramInt2 - 0.866F * paramInt1, paramInt3   paramInt1 / 2);
        return localPath;
    }

    protected void onDraw(Canvas paramCanvas)
    {
        if ((this.posX == -1) amp;amp; (this.posY == -1))
        {
            this.posX = (getWidth() / 2);
            this.posY = (getHeight() / 2);
        }
        paramCanvas.drawCircle(getWidth() /2 , getHeight() /2 , 125, this.background);
        if (this.label != null) {
            paramCanvas.drawText(this.label, getWidth() / 2, 40.0F, this.labelPaint);
        }
        paramCanvas.drawLine(getWidth() / 2, getHeight() / 2, this.posX, this.posY, this.line);
        paramCanvas.drawPath(octagon(this.thumbRadius, this.posX, this.posY), this.thumb);
    }

    public boolean onTouchEvent(MotionEvent paramMotionEvent) {
        if (this.locked == true) {
            return false;
        }
        if (paramMotionEvent.getAction() == 1 amp;amp; this.liftReset) {
            this.posX = (getWidth() / 2);
            this.posY = (getHeight() / 2);
        }else {

            for (this.posY = (getHeight() / 2); ; this.posY = min(this.posY, getHeight() - this.thumbRadius)) {
                invalidate();
                updateNormPos();

                double dx = ((int) paramMotionEvent.getX() - getWidth() / 2);
                double dy = ((int) paramMotionEvent.getY() - getHeight() / 2);
                double len = Math.hypot(dx, dy);
                if (len > 100) {
                    dx = dx * 100 / len;
                    dy = dy * 100 / len;
                }
                this.posX = (int) dx   getWidth() / 2;
                this.posY = (int) dy   getHeight() / 2;

                return true;

            }
        }
        return true;
    }

    protected void setupJoystick(Context paramContext, AttributeSet paramAttributeSet)
    {
        int i = 2;
        int j = -16776961;
        int k = -16711936;
        int m = -65536;
        this.shadowRadius = 2;
        this.thumbRadius = 23;
        TypedArray localTypedArray = paramContext.obtainStyledAttributes(paramAttributeSet, R.styleable.Joystick, 0, 0);
        try
        {
            this.thumbRadius = localTypedArray.getDimensionPixelSize(0, 23);
            this.shadowRadius = localTypedArray.getDimensionPixelSize(1, 2);
            i = localTypedArray.getDimensionPixelSize(2, 2);
            m = localTypedArray.getColor(3, -16776961);
            k = localTypedArray.getColor(4, -16777216);
            j = localTypedArray.getColor(5, -7829368);
            this.label = localTypedArray.getString(6);
            this.liftReset = localTypedArray.getBoolean(8, true);
        }
        catch (Exception localException)
        {
            for (;;)
            {
                Log.e("MYAPP", "exception: "   localException.getMessage());
                Log.e("MYAPP", "exception: "   localException.toString());
                localTypedArray.recycle();
            }
        }
        finally
        {
            localTypedArray.recycle();
        }

 // Color in everything
        this.background = new Paint();
        this.background.setColor(k);
        this.background.setStyle(Paint.Style.FILL_AND_STROKE);
        this.thumb = new Paint();
        this.thumb.setAntiAlias(true);
        this.thumb.setColor(m);
        this.thumb.setStyle(Paint.Style.FILL);
        this.line = new Paint();
        this.line.setAntiAlias(true);
        this.line.setColor(j);
        this.line.setStrokeWidth(i);
        this.line.setStyle(Paint.Style.STROKE);
        this.labelPaint = new Paint();
        this.labelPaint.setAntiAlias(true);
        this.labelPaint.setColor(-1);
        this.labelPaint.setStyle(Paint.Style.FILL);
        this.labelPaint.setTextAlign(Paint.Align.CENTER);
        this.labelPaint.setTextSize(30.0F);
        this.labelPaint.setAlpha(128);
        this.posX = -1;
        this.posY = -1;
    }
}
  

Опять же, это не исключение с нулевым указателем, оно не выдает никаких ошибок. Вероятно, я где-то допустил крошечную ошибку, но я просто не понимаю, почему я получаю 98 0 0 101 вместо 98 (координата X джойстика) (координата Y джойстика) 101.

Буду признателен за любую помощь!

Комментарии:

1. Где вы перемещаете вид джойстика? Если вы только переводите представление, вы, вероятно, хотите прочитать getTranslationX() и getTranslationY() , а не getX() и getY() .

2. Я не перевожу представление, octagon метод рисует фактический джойстик, где класс Joystick — это просто представление для всего этого.

3. getX() и getY() возвращает float то, к чему вы привели byte . Может ли быть так, что возвращаемые значения являются <1 и именно поэтому становятся 0 после приведения?