Хочу изменять размер Image линии в зависимости от угла поворота в Android

Я начинал работать с датчиками на телефоне, а конкретнее с гироскопом, но возникла проблема в том что бы сделать что то вроде 3д визуализации отклонения угла с помощью прямой линии, то есть есть прямая линия которая при вращении устройства сохраняет свою ориентацию по оси X, это спокойно реализуется в 2д пространстве. Однако когда нужно было вводить Z и Y, то уже возник вопрос как это представлять и пришла идея менять размер Image линии при повороте, однако как это сделать не совсем понимаю. Так же для того что бы визуально казалось что есть какая то пространственность нарисовал в фотошопе сферу, по которым визульно и должны двигаться линии

Возможно есть какой то другой способ представить перспективу, то хотелось бы узнать как это тоже сделать.

activity_main.xml `

[![<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/PartXY"

        android:layout_width="337dp"
        android:layout_height="688dp"
        android:background="@color/white"
        android:rotation="90"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/partx"
        tools:srcCompat="@drawable/partx"
        android:contentDescription="@null" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/perevorot"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.865" />

    <ImageView
        android:id="@+id/LineX"
        android:layout_width="338dp"
        android:layout_height="5dp"
        android:background="@color/white"
        android:contentDescription="@null"
        app:layout_constraintBottom_toBottomOf="@+id/PartXY"
        app:layout_constraintEnd_toEndOf="@+id/PartXY"
        app:layout_constraintStart_toStartOf="@+id/PartXY"
        app:layout_constraintTop_toTopOf="@+id/PartXY" />

    <ImageView
        android:id="@+id/LineZ"
        android:layout_width="338dp"
        android:layout_height="5dp"
        android:background="@color/black"
        android:contentDescription="@null"
        app:layout_constraintBottom_toBottomOf="@+id/PartXY"
        app:layout_constraintEnd_toEndOf="@+id/PartXY"
        app:layout_constraintStart_toStartOf="@+id/PartXY"
        app:layout_constraintTop_toTopOf="@+id/PartXY" />

    <TextView
        android:id="@+id/Xtext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="6dp"
        android:text="@string/X"
        android:textSize="40sp"
        app:layout_constraintBottom_toTopOf="@+id/LineX"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.124"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.005" />

    <TextView
        android:id="@+id/Ytext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="60dp"
        android:text="@string/Y"
        android:textSize="40sp"
        app:layout_constraintBottom_toTopOf="@+id/LineX"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.124"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.005" />

    <TextView
        android:id="@+id/Ztext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="120dp"
        android:text="@string/Z"
        android:textSize="40sp"
        app:layout_constraintBottom_toTopOf="@+id/LineX"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.124"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.005" />


    <TextView
        android:id="@+id/XtextV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="6dp"
        android:layout_marginStart="60dp"
        android:text="@string/X"
        android:textSize="40sp"
        app:layout_constraintBottom_toTopOf="@+id/LineX"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.124"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.005" />

    <TextView
        android:id="@+id/YtextV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="60dp"
        android:layout_marginStart="60dp"
        android:text="@string/Y"
        android:textSize="40sp"
        app:layout_constraintBottom_toTopOf="@+id/LineX"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.124"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.005" />

    <TextView
        android:id="@+id/ZtextV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="120dp"
        android:layout_marginStart="60dp"
        android:text="@string/Z"
        android:textSize="40sp"
        app:layout_constraintBottom_toTopOf="@+id/LineX"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.124"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.005" />

</androidx.constraintlayout.widget.ConstraintLayout>][1]][1]

`

MainActivity.java


    package com.example.testjava;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Context;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.Bundle;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
        private SensorManager sensorManager;
        private Sensor sensor;
        private ImageView imageLineX, imageLineY, imageLineZ;
        private TextView tvDownGradus, tvGradusX, tvGradusY, tvGradusZ;
        private SensorEventListener listener;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            tvDownGradus = findViewById(R.id.textView );
            tvGradusX = findViewById((R.id.XtextV)); 
            tvGradusY = findViewById((R.id.YtextV));
            tvGradusZ = findViewById((R.id.ZtextV));
            imageLineX = findViewById(R.id.LineX);
            //imageLineY = findViewById(R.id.LineY);
            imageLineZ = findViewById(R.id.LineZ);
    
            // Получаем доступ к гироскопу
            sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
            if(sensorManager != null)
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); // TYPE_ROTATION_VECTOR 
            listener = new SensorEventListener() {
                @Override
                public void onSensorChanged(SensorEvent event) {
    
    
                    float[] rotationMatrix = new float[16];
                    SensorManager.getRotationMatrixFromVector(
                            rotationMatrix, event.values);
    
                    float[] remappedRotationMatrix = new float[16];
                    SensorManager.remapCoordinateSystem(rotationMatrix,
                            SensorManager.AXIS_X,
                            SensorManager.AXIS_Z,
                            remappedRotationMatrix);
    
    
    // Конвертируем ориентацию в угловые градусы
                    float[] orientations = new float[3];
                    SensorManager.getOrientation(remappedRotationMatrix, orientations);
    
                    for(int i = 0; i < 3; i++) {
                        orientations[i] = (float)(Math.toDegrees(orientations[i]));
                    }
    
                    float zRotation = -orientations[0];
                    float yRotation = -orientations[1];
                    float xRotation = -orientations[2];
    
                    tvGradusX.setText(String.valueOf((int)xRotation)); // Для отображения какого то текста на View
                    tvGradusY.setText(String.valueOf((int)yRotation));
                    tvGradusZ.setText(String.valueOf((int)zRotation));
    
                    // Ориентация по X
                    tvDownGradus.setText(String.valueOf((int)xRotation));
                    //imageLineX.setRotation(-orientations[2]);
    
                    // Ориентация по Y
    
    //                imageLineY.setRotation(yRotation);
    
    
                    // Ориентация по Z
    
                    imageLineZ.setRotation((zRotation));
                    float imageScaleMin = 0.22f; // Самый минимальный размер для линнии
                    float imageScaleMax = 1f; // Самый максимальный размер для линнии
                    float imageScaleNew = imageScaleMin;
    
    
                    if (zRotation > 0 && zRotation > 90) {
                        imageScaleNew = zRotation
                    }
    
                    tvGradusY.setText(String.valueOf(imageScaleNew));
                    imageLineZ.setScaleX(imageScaleNew);
    
    
                }
    
                @Override
                public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
                }
            };
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            sensorManager.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_FASTEST);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            sensorManager.unregisterListener(listener);
        }
    
    }


Ответы (0 шт):