Android ViewGroup.setScaleX () hace que la vista se recorte
Utilizo la biblioteca de NineOldAndroids para escalar mi disposición de encargo.
public class MyLayout extends FrameLayout { // LayoutParams.MATCH_PARENT and all. ... @Override public boolean setPositionAndScale(ViewGroup v, PositionAndScale pas, PointInfo pi) { ... mScale = pas.getScale(); ViewHelper.setScaleX(this, mScale); ViewHelper.setScaleY(this, mScale); } }
He intentado FrameLayout y AbsoluteLayout. Todos tienen el mismo efecto. Cuando mScale < 1.0
escala / zoom funciona, pero parte del diseño se recorta .
- Cómo generar el gesto de zoom / pellizco para probar para Android
- Pinch Zoom ListView Android
- Obtener el ancho interno de la ventana y la altura del androide integrado en el navegador web en todos los niveles de zoom
- Cómo poblar webview en android con texto sin formato de base de datos y ser capaz de manejar caracteres de nueva línea
- Android google maps no se puede ampliar con compás activo
mScale = 1.0:
mScale < 1.0:
escala / zoom funciona, pero el diseño se recorta
¿Cómo puedo solucionar este problema?
Edit : La foto fue tomada en ICS. Así que no creo que sea NineOldAndroids problema.
- Los eventos de zoom que funcionan en un androide Mapview
- Cambiar controles de zoom en un MapView
- Cómo ampliar una vista de texto en android?
- Zoom de Android y rotación de la vista de imagen
- ¿Cómo puedo implementar zoom en la Biblioteca Fresco?
- Wiki sobre android-zoom-view.jar
- Cómo fijar correctamente fixTransX y fixTransY de TouchImageView para implementar doubleTap a ZoomOut?
- Activar / desactivar el zoom en Android WebView
El padre de tu vista debe tener la propiedad android:clipChildren
disabled (desde el archivo de diseño o con setClipChildren(false)
).
Pero con este método no obtendrá los eventos de toque fuera de los límites del clip de vista. Puede trabajar a su alrededor enviándolos desde su actividad o escribiendo un padre personalizado de ViewGroup
.
Estoy usando un hack diferente que parece funcionar en mi caso, el truco es mantener su propia matriz de transformación. Entonces, tienes que sobrecargar mucho del ViewGroup
de ViewGroup
para hacer que funcione. Por ejemplo :
@Override protected void dispatchDraw(Canvas canvas) { Log.d(TAG, "dispatchDraw " + canvas); canvas.save(); canvas.concat(mMatrix); super.dispatchDraw(canvas); canvas.restore(); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.d(TAG, "dispatchTouchEvent " + ev); ev.transform(getInvMatrix()); // return super.dispatchTouchEvent(ev); } private Matrix getInvMatrix() { if(!mTmpMatIsInvMat) mMatrix.invert(mTmpMat); mTmpMatIsInvMat = true; return mTmpMat; }
En caso de que alguien se metiera en la misma situación que yo. Terminé usando este enfoque:
protected void setScale(float scale, boolean updateView) { mScale = scale; if (updateView) { LayoutParams params = getLayoutParams(); onUpdateScale(scale, params); setLayoutParams(params); } } protected void onUpdateScale(float scale, LayoutParams params) { params.leftMargin = (int) (mModel.getX() * scale); params.topMargin = (int) (mModel.getY() * scale); params.width = (int) (mModel.getWidth() * scale); params.height = (int) (mModel.getHeight() * scale); }
Si entiendo su problema correctamente, está cambiando de escala un grupo de vistas y espero que las vistas incluidas se escalen en consecuencia. No funciona de esa manera: se escala el grupo de vistas y cambia de tamaño, pero las vistas de sus hijos no.
Basta con escalar todas las sub-vistas. Aún así, no estoy seguro de que los textos y las imágenes se van a escalar automáticamente. Lo que quieres es zoom, no escala. Intente esta referencia .
Desde el nivel 11 de API, la clase View
tiene los setScaleX()
y setScaleY()
, que funcionan como se esperaba y también setScaleY()
escala de la vista escalada. Así que, si eso es una manera para ti, deja la biblioteca y hazlo
v.setScaleX(mScale); v.setScaleY(mScale);
Utilice ViewGroup.layout. Puede ser la forma más fácil de escalar (& mover) ViewGroup.
- ContentProvider sin SQL
- Implemente la rotación de vista de imagen con límite de pantalla en la clase inferior