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:
- MediaServer Remote Binder Objeto de cámara muerto - sólo en KITKAT
- ¿Debería el renderingThread de un SurfaceView tener el mismo ciclo de vida que la vista o la actividad?
- Android OpenGL que extiende las excepciones de puntero nulo de GLSurfaceView
- ¿Cómo utilizar el feed de cámara en vivo como un fondo de actividad?
- Android Cámara de visión de superficie cámara recreada cuando presiono botón de nuevo en la tableta de Archos en jellybean
<?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:
- 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
- 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 …
- Teclado Android: no inicializa el cliente de búfer compartido porque token = -12
- Android: vista de la cámara: la aplicación se bloquea cuando no utilizo un método obsoleto
- Android translate ImageView sobre SurfaceView
- Malo rendimiento al dibujar continuamente en CustomView
- SlidingDrawer ocultado por la imagen en SurfaceView
- Grafika's CameraCaptureActivity - vista previa de la cámara distorsionada en vista previa tamaño cambiar
- escala de previsualización de la cámara para adaptarse a la mitad de la pantalla
- El lienzo SurfaceView de Android produce colores incorrectos
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.
- Firebase / Android – Perdiendo regularmente la conexión a la base de datos
- Agregar una fila a un ListView que muestre "Cargando" mientras se descarga la información. Como en el mercado