Я работаю над подклассом FrameLayout, который должен вращать все его дети на 90 градусов. Я делаю это, чтобы преодолеть ограниченное по ландшафту ограничение камеры, присутствующее в android 2.1 и ниже, благодаря тому, что активность была в ландшафте, но накладывая наложение этой камеры на этот оверлей рамки, чтобы он выглядел так, как будто это был портрет (this is how Layar does it). сделайте это, я приспосабливаю Jeff Sharkey's code, чтобы повернуть виды. Моя проблема в том, что я могу повернуть Framelayout, но я не могу изменить его размер в соответствии с новыми измерениями. Так что на моем g1, а не на 320x480 портретном представлении над разрешением 480x320 в ландшафте, я получаю окно размером 320x320 посередине, показывая мой портретный вид с опущенными сторонами.Инициализация повернуть 90 градусов
Вот мой код до сих пор:
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);
}
}
Я попытался перекрывая OnMeasure
переключить X и Y размеры View, но не были в состоянии получить, чтобы работать. Любая помощь, которую вы можете предоставить, очень ценится.
Привет, вы так решили? – fhucho
Nope - окончательное решение заключалось в том, чтобы использовать вышеуказанный код как есть и просто поворачивать кнопки, текстовые изображения и т. Д. Индивидуально, обертывая каждый из них в одном из них. Это не очень элегантно, но это работает. – QRohlf
Я считаю, что внутри 'dispatchTouchEvent()' вы должны использовать 'getRawX()' и 'getRawY()' вместо 'getX()' и 'getY()'. Во всяком случае, это работает лучше для меня. Мой взгляд квадратный, fwiw. –