Autore Topic: Eventi di più istanze della stessa custom View  (Letto 282 volte)

Offline vilandra

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Wildfire
  • Sistema operativo:
    Windows XP
Eventi di più istanze della stessa custom View
« il: 06 Aprile 2011, 18:03:13 CEST »
0
Ciao, sono nuova su Android.
Nel mio progetto ho una custom View MyView, con il seguente codice

Codice (Java): [Seleziona]
public class MyView extends View {

    private final Bitmap baseBitmap = BitmapFactory.decodeResource(
            getResources(), R.drawable.myImage);
    private final Matrix matrix;
    private boolean active = true;

    public MyView(Context context, Matrix matrix) {
        super(context);
        this.matrix = matrix;
        this.setFocusable(true);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);  
        if (active) {
            System.out.println("draw "+this.getId());
            canvas.drawBitmap(baseBitmap, matrix, null);
        } else {
        ...
        }
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            System.out.println("--------->"+this.getId());
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            this.matrix.setTranslate(event.getX()-(baseBitmap.getWidth()/2), event.getY()-(baseBitmap.getHeight()/2));
            this.invalidate();
        } else if (event.getAction() == MotionEvent.ACTION_UP) {

            this.active = false;
        }
        return true;
    }

Nell'Activity, istanzio più volte MyView, aggiungendo ogni istanza al layout principale:

Codice (Java): [Seleziona]
public class MyActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      Display display = getWindowManager().getDefaultDisplay();
      float cx = display.getWidth() / 2, cy = display.getHeight() / 2;
      int radius = 80;
      double distance = 0, distancePoint = 0;
      final int flags = PathMeasure.POSITION_MATRIX_FLAG
            | PathMeasure.TANGENT_MATRIX_FLAG;
      float length = 0;
      setContentView(R.layout.main);
      RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.main_view);
      Path pathCircle = new Path();
      pathCircle.addCircle(cx, cy, radius, Direction.CW);
      PathMeasure meas = new PathMeasure(pathCircle, false);
      int nObject = 10;
      length = meas.getLength();
      distance = length/nPetali;
      int i = 0;        
            while(i<nObject){
                Matrix m = new Matrix();
                meas.getMatrix((float)distancePoint, m, flags);
                MyView myView = new MyView(this, m);
                System.out.println(myView.toString());
                myView.setId(i);
                mainLayout.addView(myView,i);
                i++;
                distancePoint = distance*i;
            }
      }                              
}

A runtime, quando tocco qualsiasi elemento istanza di MyView ottengo sempre il controllo dell'ultima. Con
Codice (Java): [Seleziona]
System.out.println("--------->"+this.getId()); posso verificare che l'id dell'elemento toccato è sempre l'ultimo aggiunto e, in effetti, qualunque elemento tocchi e sposti viene mosso sempre l'ultimo.
Temendo che il problema fosse dovuto ad un'eventuale sovrapposizione degli oggetti nel layout, ho provato a specificare i LayoutParams, modificando il ciclo che aggiunge le istanze di MyView come segue:
Codice (Java): [Seleziona]
while(i<nObject){
      Matrix m = new Matrix();
      meas.getMatrix((float)distancePoint, m, flags);
      MyView myView = new MyView(this, m);
      System.out.println(myView.toString());
      myView.setId(i);
      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
       if(i>0){    
            params.addRule(RelativeLayout.ALIGN_LEFT,i-1);              
       }

      myView.setLayoutParams(params);
      mainLayout.addView(myView,i);
      distancePoint = distance*i;
      i++;
  }
ma il risultato è sempre lo stesso
Qualcuno sa dirmi dove sbaglio, perchè non riesco ad ottenere il controllo degli eventi di ogni istanza?
Grazie