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 .

mScale = 1.0:

MScale = 1.0

mScale < 1.0: escala / zoom funciona, pero el diseño se recorta

MScale <1.0

¿Cómo puedo solucionar este problema?

Edit : La foto fue tomada en ICS. Así que no creo que sea NineOldAndroids problema.

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.

  • Cámara android cámara2 manejar zoom
  • Zoom centrado en la vista personalizada - calculando las coordenadas de lienzo
  • Rendimiento deficiente de la animación de zoom personalizado de Android
  • Comportamiento extraño de superposición al ampliar el MapView
  • Cómo hacer zoom en android: mantener la imagen a la vista
  • ¿Cómo pellizcar zoom imagen en zoom de imagen android?
  • Cómo utilizar Android Map para hacer zoom con gesto de la mano (iphone like)
  • Cómo reducir la vista de diseño de Android en Intellij Idea12?
  • Construcción de un contenedor capaz de hacer zoom
  • Dibujar y hacer zoom sobre ImageView y lienzo en Android
  • Cómo configurar Google Maps API v2 para mostrar mapa del mundo entero?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.