tentando di modificare il codice di Mandelbrot per aggiungere uno zoom basato sull'evento touch mi sono imbattuto nel seguente errore
Reacting to signal 3 Wrote stack traces to '/data/anr/traces.txt'
indagando un po' meglio ho capito di essermi imbattuto in un errore di ANR (Application Not Responding) che viene segnalato quando l'applicazione non risponde ad un evento di input entro 5 secondi (questo il mio caso) oppure un task non e' finito entro 10 secondi
Fino a quando l'insieme di Mandelbrot viene gestito nella procedura principale la procedura termina correttamente mentre quando il comando calcola() viene lanciato dall'evento TouchEvent il programma si blocca.
di seguito il codice per riprodurre l'errore
package com.mandelbrot.explorer;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.widget.ImageView;
public class MandelbrotExplorerActivity extends Activity {
private static double re_min = -2.5;
private static double re_max = 1.0;
private static double im_min = -1.0;
private static double im_max = 1.0;
private static int iterazioni = 100;
private double y;
private double x;
private double ynew;
private double xnew;
private int test;
private double re_factor;
private double im_factor;
public boolean zoom;
public Bitmap bitmap;
public Paint paint;
public Canvas canvas;
private int width;
private int height;
private double b;
private double a;
public ImageView view;
/** Called when the activity is first created. */
private void calcola(double re_min1, double re_max1, double im_min1, double im_max1)
{
zoom = false;
re_factor = (re_max1 - re_min1);
im_factor = (im_max1 - im_min1);
// recupera le informazioni sulle dimensioni dello schermo
for (int i=0;i<width;i++)
{
for (int j=0;j<height;j++)
{
b = im_min + i * im_factor / width;
a = re_min + j * re_factor / height;
x = 0.0;
y = 0.0;
test = 0;
for (int k=0;k<iterazioni;k++)
{
xnew = x * x - y * y + a;
ynew = 2 * x * y + b;
if (((xnew*xnew)+(ynew*ynew))>4)
{
test = k;
k = iterazioni;
}
x = xnew;
y = ynew;
}
if (test%2 == 1)
{
//punto bianco
canvas.drawPoint(i, j, paint);
}
}
}
zoom = true;
}
public void onCreate(Bundle savedInstanceState) {
//StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().penaltyDeath().build());
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
view = (ImageView) findViewById(R.id.imageView1);
Display display = getWindowManager().getDefaultDisplay();
width = display.getWidth(); //240
height = display.getHeight();//320
bitmap = Bitmap.createBitmap(width, height, Config.RGB_565);
paint = new Paint();
paint.setColor(Color.WHITE);
canvas = new Canvas(bitmap);
canvas.drawColor(Color.BLACK);
view.setImageBitmap(bitmap);
calcola(re_min,re_max,im_min,im_max);
}
public boolean onTouchEvent(MotionEvent event) {
int x = (int)event.getX();
int y = (int)event.getY();
Log.d("pos_x",Double.toString(x));
Log.d("pos_y",Double.toString(y));
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
}
calcola(-1.0,0.5,-1.0,0.5);
return false;
}
}
Iscriviti a:
Commenti sul post (Atom)
Dockerizza Flask
Un esempio semplice per inserire in un container Docker una applicazione Flask Partiamo da una semplice applicazione che ha un file app.py ...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...
Nessun commento:
Posta un commento