我正在开发一个FrameLayout的子类,旨在将其所有子项旋转90度。 我这样做是为了克服Android 2.1及以下版本中仅支持横屏模式相机的限制,使活动处于横向状态,但将我的相机叠加层放置到此FrameLayout中,使其看起来好像是竖向模式(Layar就是这样做的)。 为了实现这一点,我正在使用Jeff Sharkey的代码来旋转视图。 我的问题是我可以旋转Framelayout,但无法调整大小以匹配新的尺寸。 因此,在我的G1上,我得到一个320x320的框中间显示我的纵向视图,两侧被切掉而不是一个320x480的竖直视图覆盖着一个480x320的横向相机视图。
这是我目前的代码:
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()
。至少对我来说,这样效果更好。顺便提一下,我的视图是正方形。 - Carl Manaster