Je suis en train de travailler sur une sous-classe de FrameLayout qui est censé faire tourner tous ses enfants de 90 degrés. Je suis en train de faire ce pour surmonter le paysage seule caméra limitation présent dans android 2.1 et au-dessous, en ayant l'activité dans le paysage, mais la pose de mon appareil photo superposition dans ce framelayout superposition de la faire apparaître comme si il était en mode portrait (c'est de cette façon Layar t-il) Pour ce faire, je suis l'adaptation de Jeff Sharkey du code pour faire pivoter les vues. Mon problème est que je peut faire tourner le Framelayout, mais je ne peux pas redimensionner pour qu'elle corresponde à la nouvelle dimension. Donc sur mon g1, au lieu d'un 320x480 portrait de vue sur un 480x320 vue de la caméra en mode paysage, je reçois un 320x320 zone dans le milieu montrant mon portrait avec les côtés coupés.
Voici mon code pour l'instant:
public class RotateLayout extends FrameLayout {
private Matrix mForward = new Matrix();
private Matrix mReverse = new Matrix();
private float[] mTemp = new float[2];
public RotateLayout(Context context) {
super(context);
}
public RotateLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
/* (non-Javadoc)
* @see android.widget.FrameLayout#onMeasure(int, int)
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//This didn't work:
//super.onMeasure(heightMeasureSpec, widthMeasureSpec);
}
/* (non-Javadoc)
* @see android.widget.FrameLayout#onSizeChanged(int, int, int, int)
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
protected void dispatchDraw(Canvas canvas) {
canvas.rotate(270, getWidth()/2, getHeight()/2);
//This code will stretch the canvas to accommodate the new screen size. This is not what I want.
//float scaleX=(float)getHeight()/getWidth();
//float scaleY=(float)getWidth()/getHeight();
//canvas.scale(scaleX, scaleY, getWidth()/2, getHeight()/2);
mForward = canvas.getMatrix();
mForward.invert(mReverse);
canvas.save();
canvas.setMatrix(mForward); //This is the matrix we need to use for proper positioning of touch events
super.dispatchDraw(canvas);
canvas.restore();
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
final float[] temp = mTemp;
temp[0] = event.getX();
temp[1] = event.getY();
mReverse.mapPoints(temp);
event.setLocation(temp[0], temp[1]);
return super.dispatchTouchEvent(event);
}
}
J'ai essayé primordial OnMeasure
pour changer les dimensions X et Y de la Vue, mais n'ont pas été en mesure d'obtenir que cela fonctionne.
Toute aide que vous pouvez fournir est grandement apprécié.