Layout con posizione dynamic

Ho un layout che potrebbe essere un po 'insolito. La struttura è la seguente:

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <org.CustomSurfaceView android:id="@+id/page_flip" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginBottom="20dip" /> <org.customRelativeLayout android:id="@+id/note" android:layout_width="fill_parent" android:layout_height="fill_parent" android:visibility="gone" /> </FrameLayout> 

Il mio customRelativeLayout nella parte inferiore dell'XML ha anche un layout XML:

  • Come calcolare la frequenza sonora in android?
  • Perché gli emulatori Android sono numerati come 5554
  • Come creare BroadcastReceiver senza attività / servizio?
  • android studio java.lang.NoClassDefFoundError:
  • Disegnando bitmap ruotato con anti alias
  • Disegna una linea con bordi curvi in ​​Android
  •  <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="200dp" android:layout_height="200dp" android:background="@drawable/my_background" android:id="@+id/note_layout"> <TextView android:id="@+id/note" android:layout_width="fill_parent" android:layout_height="fill_parent" android:singleLine="false" android:layout_margin="5dp" android:textColor="#000000" /> </LinearLayout> 

    My CustomRelativeLayout:

     public class CustomRelativeLayout extends RelativeLayout implements OverlayView { private TextView mNoteText; private LinearLayout mLinearLayout; public int mX = 0; public int mY = 0; public boolean mShow; public CustomRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); li.inflate(R.layout.note, this); mNoteText = (TextView) findViewById(R.id.note); mLinearLayout = (LinearLayout) findViewById(R.id.note_layout); mLinearLayout.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.e("touched"); mX = (int) event.getX() - 100; mY = (int) event.getY() - 100; invalidate(); return false; } }); } @Override public void hide() { mShow = false; setVisibility(View.GONE); } @Override public boolean isVisible() { return isVisible(); } @Override protected void onDraw(Canvas canvas) { Log.e("Drawing the postit"); Matrix matrix = new Matrix(); matrix.postTranslate(mX, mY); canvas.setMatrix(matrix); super.onDraw(canvas); } @Override public void setContent(Object content) { if (content != null && content instanceof Content) { Content noteContent = (Content) content; if (noteContent.getText() != null) { mNoteText.setText(noteContent.getText()); } else { mNoteText.setText(""); } } mNoteText.invalidate(); mLinearLayout.invalidate(); } @Override public void show() { mShow = true; setVisibility(View.VISIBLE); } } 

    Che cosa voglio fare: voglio essere in grado di cambiare la posizione del mio CustomRelativeLayout. Dovrebbe seguire il mio touch. È più piccolo del SurfaceView e dovrebbe "scivolare" sopra dopo il mio touch …

    Ci sono due problemi:

    1. L'onTouchListener si lega a mLinearLayout (in CustomRelativeLayout) viene triggersta solo una volta e solo per ACTION_DOWN. Vedo l'output del log solo una volta
    2. La nota non cambia mai la posizione, non viene mai ridisegnata con la matrix modificata … vedo l'output indicato in onDraw non dopo il contatto.

    In primo luogo potrebbe essere perché SurfaceView gestisce anche events di contatto. Ma ho pensato che se la CustomRelativeLayout lo tratti in primo luogo, dovrebbe funzionare.

    Qualche idea?

    Modifica per la soluzione

    Grazie a Xil3 sono stato in grado di rimuovere il muro che mi è stato affrontato … ecco la mia soluzione:

    la mia nota xml:

     <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/transparent"> <LinearLayout android:layout_width="200dp" android:layout_height="200dp" android:background="@drawable/postit" android:id="@+id/textnote_layout"> <TextView android:id="@+id/textnote_content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:singleLine="false" android:layout_margin="5dp" android:textColor="#000000" /> </LinearLayout> </LinearLayout> 

    Ed ecco il mio constructor:

     public TextNoteOverlay(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); li.inflate(R.layout.textnote, this); mNoteText = (TextView) findViewById(R.id.textnote_content); mLinearLayout = (LinearLayout) findViewById(R.id.textnote_layout); setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mLinearLayout.getHitRect(mNoteRect); if (mNoteRect.contains((int) event.getX(), (int) event.getY())) { if (event.getAction() == MotionEvent.ACTION_DOWN) { mStartX = (int) event.getX() - mLinearLayout.getLeft(); mStartY = (int) event.getY() - mLinearLayout.getTop(); return true; } mX = (int) event.getX() - mStartX; mY = (int) event.getY() - mStartY; mLinearLayout.layout(mX, mY, mX + mLinearLayout.getWidth(), mY + mLinearLayout.getHeight()); return true; } return false; } }); } 

    Ho anche trovato un bug / feature / issue, che è assolutamente nuovo per me: quando rimuovo lo background nell'elemento di base di nota (che è attualmente trasparente) la nota è visibile solo all'interno della width / altezza 200dp che ho impostato nell'interno LinearLayout. Quindi il suo non fill_parent , il suo wrap_content anche se l'ho impostato a fill_parent . Quindi layout_width e layout_height usano solo il dato fill_parent quando è impostato uno background … weired …

  • come gestire il button di ripristino del dispositivo sull'applicazione sencha touch
  • Creazione di LinearLayout in modo programmato / dinamico con più visualizzazioni
  • Visualizzare i contatti solo con i numbers di telefono utilizzando l'intenzione ACTION_PICK nel dispositivo Android
  • Come rendere trasparente la barra di navigazione
  • Il volley di Android ottiene il richiamo quando tutte le richieste finiscono
  • Disegno UI di Android: supporto di più schermate
  • One Solution collect form web for “Layout con posizione dynamic”

    Il problema è che stai restando falso nell'evento onTouch, quindi stai dicendo che non sei interessato a eventuali events successivi.

    Cambi questo per tornare vero.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.