我使用NineOldAndroids库来扩展我的自定义布局.
public class MyLayout extends FrameLayout {
// LayoutParams.MATCH_PARENT and all.
...
@Override
public boolean setPositionAndScale(ViewGroup v, PositionAndScale pas, PointInfo pi) {
...
mScale = pas.getScale();
ViewHelper.setScaleX(this, mScale);
ViewHelper.setScaleY(this, mScale);
}
}
我尝试过FrameLayout和AbsoluteLayout.都具有相同的效果.
当mScale< 1.0缩放/缩放工作但部分布局被剪裁.
mScale = 1.0:
mScale< 1.0:缩放/缩放工作但布局被剪裁
我该如何解决这个问题?
编辑:照片拍摄于ICS.所以我不认为这是NineOldAndroids的问题.
解决方法:
视图的父级必须具有属性android:clipChildren disabled(来自布局文件或使用setClipChildren(false)).
但是使用此方法,您不会在视图剪辑边界之外获得触摸事件.您可以通过从活动中发送它们或编写自定义ViewGroup父级来解决此问题.
我正在使用一个不同的黑客,这似乎适用于我的情况,诀窍是维护自己的转换矩阵.然后,你必须重载很多ViewGroup的方法才能使它工作.例如 :
@Override
protected void dispatchDraw(Canvas canvas) {
Log.d(TAG, "dispatchDraw " + canvas);
canvas.save();
canvas.concat(mMatrix);
super.dispatchDraw(canvas);
canvas.restore();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.d(TAG, "dispatchTouchEvent " + ev);
ev.transform(getInvMatrix()); //
return super.dispatchTouchEvent(ev);
}
private Matrix getInvMatrix()
{
if(!mTmpMatIsInvMat)
mMatrix.invert(mTmpMat);
mTmpMatIsInvMat = true;
return mTmpMat;
}