【发布时间】:2011-03-27 13:31:44
【问题描述】:
我正在研究 FrameLayout 的子类,它应该将其所有子类旋转 90 度。我这样做是为了克服 android 2.1 及更低版本中存在的仅横向相机限制,方法是让活动处于横向状态,但将我的相机叠加层放置在此框架布局叠加层中以使其看起来好像是纵向的 (this is how Layar does it ) 为了实现这一点,我正在调整 Jeff Sharkey's code 来旋转视图。我的问题是我可以旋转 Framelayout,但我无法调整它的大小以匹配新尺寸。所以在我的 g1 上,不是 320x480 纵向视图而不是横向 480x320 相机视图,而是在中间有一个 320x320 框显示我的纵向视图,侧面被切掉。
到目前为止,这是我的代码:
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 尺寸,但无法使其正常工作。
非常感谢您提供的任何帮助。
【问题讨论】:
-
嗨,你解决了这个问题吗?
-
不——最终的解决方案是按原样使用上面的代码,只需将按钮、文本视图等分别包装在其中一个中即可。它不是很优雅,但很有效。
-
我相信在
dispatchTouchEvent()内部你应该使用getRawX()和getRawY()而不是getX()和getY()。无论如何,这对我来说效果更好。我的观点是方形的,fwiw。 -
正如 Carl Manaster 所说,它必须是 getRawX 和 getRawY。给卡尔+1,因为它解决了我的问题。谢谢。
标签: android android-layout animation android-widget