Я разрабатываю приложение, которое использует датчик ускорения для перемещения шара по экрану.Я нарисовал шар, используя Canvas , и каждый раз, когда рисунок «касался» конца экрана, показывалось сообщение, сообщающее пользователю соответствующую сторону.
Как показано в следующемimage:
Тост показывает сообщение: «движение влево», переведенное с испанского на английский язык.
Вы видитечто сообщение отображается правильно.
Проблема возникает, когда я нажимаю на кнопку возврата телефона:
Ваши симптомы:
- Сообщение изображенияснова отображается в зависимости от ориентации телефона.
- Сообщения, по-видимому, циклические, то есть, даже если вы не двигаетесь, сообщения являются случайными.
Сообщения Toast ведут себя так, как будто они все еще были в предыдущем действии, то есть из которого я ушел.Иногда он показывает предупреждение только тогда, когда я перемещаю телефон, а в другое время, не перемещая его несколько раз и случайным образом.
Ручная кнопка главного экрана - это та, которая направляет вид на Активность первой фотографии смяч.
Хотя в этом представлении нажмите кнопку возврата, сообщение продолжает отображаться даже после того, как я вернулся на экран своих приложений.
Единственный способ устранить эту проблему - удалить приложение избанк приложений и процесс снова совпадают.
Я подчеркиваю, что проблема возникает только тогда, когда я вхожу в это представление и возвращаюсь, пока этого не произошло.
Я прикрепляю основной код:
btnManual.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MovimientoActivity.class);
startActivity(intent);
}
Однажды в MovimientoActivity.class
public class MovimientoActivity extends AppCompatActivity{
private DrawView view; //Class where the ball is created with the accelerometer
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toast.makeText(this, "Cliclo-onCreate", Toast.LENGTH_SHORT).show();
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
view = new DrawView(this, displaymetrics); //Se llama a esa vista
view.setBackgroundColor(Color.parseColor("#F5B041"));
setContentView(view);
//Definimos usar toda la pantalla
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}
});
Class DrawView.java
public class DrawView extends View implements SensorEventListener {
Cliente cliente = null;
Sensor accelerometer = null;
SensorManager manager;
static String TAG = "DrawView";
int BLOQUEO_ARRIBA = 0;
int BLOQUEO_ABAJO = 0;
int BLOQUEO_DERECHO = 0;
int BLOQUEO_IZQUIERDO = 0;
private Bitmap pelota;
public int ALTURA;
public int ANCHO;
DisplayMetrics displaymetrics;
Punto posicion = new Punto();
final int X = 0;
final int Y = 1;
final int Z = 2;
public DrawView(Context context, DisplayMetrics displaymetrics) {
super(context);
this.displaymetrics = displaymetrics;
manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
if (manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() != 0) {
accelerometer = manager.getSensorList(
Sensor.TYPE_ACCELEROMETER).get(0);
if (!manager.registerListener(this, accelerometer,
SensorManager.SENSOR_DELAY_FASTEST)) {
}
}
try {
AssetManager assetManager = context.getAssets();
InputStream inputStream;
inputStream = assetManager.open("bola_2.png");
pelota = BitmapFactory.decodeStream(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
// Obtenemos las medidas de la pantalla
ALTURA = displaymetrics.heightPixels;
ANCHO = displaymetrics.widthPixels;
}
@Override
public void onSensorChanged(SensorEvent event) {
// Modificamos la posicion de la bola en el eje X
posicion.x -= event.values[X];
//Comprobamos si se sale de la pantalla, y en ese caso, modificamos su valor
if (posicion.x < 0) {
if(BLOQUEO_IZQUIERDO == 0){
Log.i(TAG, "onSensorChanged: izquierdo");
Toast.makeText(getContext(), "Movimiento a la izquierda", Toast.LENGTH_SHORT).show();
BLOQUEO_DERECHO = 0;
BLOQUEO_ARRIBA = 0;
BLOQUEO_ABAJO = 0;
BLOQUEO_IZQUIERDO++;
}
posicion.x = 0;
}else if (posicion.x > this.ANCHO -pelota.getWidth()) {
if(BLOQUEO_DERECHO == 0){
Log.i(TAG, "onSensorChanged: derecho");
Toast.makeText(getContext(), "Movimiento a la derecha", Toast.LENGTH_SHORT).show();
BLOQUEO_IZQUIERDO = 0;
BLOQUEO_ARRIBA = 0;
BLOQUEO_ABAJO = 0;
BLOQUEO_DERECHO++;
}
posicion.x = this.ANCHO - pelota.getWidth();
}
//Modificamos la posicion de la bola en el eje Y
posicion.y += event.values[Y];
//Comprobamos si se sale de la pantalla, y en ese caso, modificamos su valor
if (posicion.y < 0) {
if(BLOQUEO_ARRIBA == 0){
Log.i(TAG, "onSensorChanged: arriba");
Toast.makeText(getContext(), "Movimiento hacia arriba", Toast.LENGTH_SHORT).show();
BLOQUEO_DERECHO = 0;
BLOQUEO_IZQUIERDO = 0;
BLOQUEO_ABAJO = 0;
BLOQUEO_ARRIBA++;
}
posicion.y = 0;
}else if (posicion.y > this.ALTURA - pelota.getHeight()) {
if(BLOQUEO_ABAJO == 0){
Log.i(TAG, "onSensorChanged: abajo");
Toast.makeText(getContext(), "Movimiento hacia abajo", Toast.LENGTH_SHORT).show();
BLOQUEO_DERECHO = 0;
BLOQUEO_ARRIBA = 0;
BLOQUEO_IZQUIERDO = 0;
BLOQUEO_ABAJO++;
}
posicion.y = this.ALTURA - pelota.getHeight();
}
//Método invalidate para llamar onDraw
invalidate();
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawBitmap(pelota, posicion.x, posicion.y, null);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
Переменные, которые я объявил как BLOQUEO, потому что мне нужен только датчик, чтобы сообщить мне о событии один раз, так что если онЯ выполню другое действие, пока другой конец не будет «затронут».
Ну, пока это проблема.В конце концов, моя цель - не дать сенсору продолжать работать после снятия экрана мяча или если он перестает работать в фоновом режиме, если в этом проблема.
Я ценю помощь, которую вы можете оказатья.