Хочу изменять размер 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);
}
}