我正在研究FrameLayout的子類,它應該將其所有子級旋轉90度。我這樣做是爲了克服android 2.1及其以下版本中的風景相機限制,通過讓活動處於橫向模式,但將相機覆蓋層放入此framelayout覆蓋層,使其看起來好像是縱向(this is how Layar does it)。完成這個,我正在修改Jeff Sharkey's code來旋轉視圖。我的問題是我可以旋轉Framelayout,但我無法調整它的大小來匹配新的尺寸。所以在我的g1上,取代了橫向480x320相機視圖上的320x480縱向視圖,在中間顯示了一個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尺寸,但一直沒能得到那個工作。 任何幫助,您可以提供非常感謝。
嗨,你有沒有解決這個問題? – fhucho 2010-09-05 13:41:55
不 - 最終的解決方案是按原樣使用上述代碼,並通過將各個按鈕包裝在其中之一中來單獨旋轉按鈕,文本瀏覽等。這不是很優雅,但它的作品。 – QRohlf 2010-09-06 22:50:51
我相信'dispatchTouchEvent()'裏面應該使用getRawX()和getRawY()來代替getX()和getY()。無論如何,這對我來說效果更好。我的觀點是方形的,fww。 – 2011-04-27 23:21:40