我用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
禁用(从布局文件或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;
}
如果任何人有到同样的情况我。 我结束了使用这种方法:
protected void setScale(float scale, boolean updateView) {
mScale = scale;
if (updateView) {
LayoutParams params = getLayoutParams();
onUpdateScale(scale, params);
setLayoutParams(params);
}
}
protected void onUpdateScale(float scale, LayoutParams params) {
params.leftMargin = (int) (mModel.getX() * scale);
params.topMargin = (int) (mModel.getY() * scale);
params.width = (int) (mModel.getWidth() * scale);
params.height = (int) (mModel.getHeight() * scale);
}
由于API等级11,该View
类具有setScaleX()
和setScaleY()
方法,如预期,规模也缩放视图的子视图的工作。 所以,如果想成为你的方式,降库,只是做
v.setScaleX(mScale);
v.setScaleY(mScale);
如果我没有理解你的问题,你是缩放视图组,并期望包含的观点相应地扩大。 它不工作的方式:你缩放视图组,它改变大小,但它的孩子们的意见没有。
只是缩放所有子视图。 即便如此,我不知道该文本和图像都将被自动缩放。 你想要的是变焦,无法形成规模。 试试这个参考 。
使用ViewGroup.layout。 这可能是规模(移动)ViewGroup中最简单的方法。