Diseño con posición dinámica

Tengo un diseño que podría ser un poco inusual. La estructura es la siguiente:

<?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> 

Mi customRelativeLayout en la parte inferior del XML tiene un diseño XML también:

 <?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> 

Mi 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); } } 

Lo que quiero hacer: Quiero ser capaz de cambiar la posición de mi CustomRelativeLayout. Debe ser seguir mi tacto. Su más pequeño que el SurfaceView y debe "deslizar" más allá de mi toque …

Hay dos problemas:

  1. El enlace onTouchListener a mLinearLayout (en CustomRelativeLayout) sólo se activa una vez y sólo para ACTION_DOWN. Veo la salida del registro sólo una vez
  2. La nota nunca cambia la posición, nunca se vuelve a dibujar con la matriz cambiada … Veo la salida indicada en onDraw nunca después de que el toque sucedió.

Primero podría ser porque el SurfaceView también maneja eventos táctiles. Pero pensé que si el CustomRelativeLayout maneja primero, debería funcionar.

¿Algunas ideas?

Editar para la solución

Gracias a Xil3 pude eliminar la pared en la que me encontré … aquí está mi solución:

Mi 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> 

Y aquí está mi 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; } }); } 

También encontré un bug / feature / issue, que es absolutamente nuevo para mí: Cuando quito el fondo en mi elemento raíz de nota (que es actualmente transparente) la nota sólo es visible dentro de la anchura 200dp / altura que he establecido en el interior LinearLayout. Así que no es fill_parent , su wrap_content incluso cuando lo configuro para fill_parent . Así que layout_width y layout_height sólo usan el fill_parent dado cuando se configura un fondo … weired …

El problema es que estás devolviendo false en el evento onTouch – así que básicamente dices que no estás interesado en ningún evento posterior.

Cambiar eso para devolver true.

  • Android: creación de un mapa de bits con contenido de SurfaceView
  • Android: holder.getSurface () devuelve siempre null
  • Evitar el "parpadeo" al llamar a Drawable.draw ()
  • SurfaceView for Camera Preview no se destruye cuando se pulsa el botón de encendido
  • GetSupportedPictureSize () devuelve un valor que no es realmente compatible con Nexus4
  • Se ha abandonado BufferQueue: Al reproducir vídeo con TextureView
  • Combinación de SurfaceView con otras vistas, como TextView y botones
  • Cámara de conmutación de adelante hacia atrás en pjsip android
  • Android IllegalArgumentException lockCanvas ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.