机器人ViewGroup.setScaleX()导致被裁剪视图(Android ViewGroup.

2019-06-27 20:49发布

我用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问题。

Answer 1:

你的观点的家长必须具备的使用性能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;
}


Answer 2:

如果任何人有到同样的情况我。 我结束了使用这种方法:

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);
}


Answer 3:

由于API等级11,该View类具有setScaleX()setScaleY()方法,如预期,规模也缩放视图的子视图的工作。 所以,如果想成为你的方式,降库,只是做

v.setScaleX(mScale);
v.setScaleY(mScale);


Answer 4:

如果我没有理解你的问题,你是缩放视图组,并期望包含的观点相应地扩大。 它不工作的方式:你缩放视图组,它改变大小,但它的孩子们的意见没有。

只是缩放所有子视图。 即便如此,我不知道该文本和图像都将被自动缩放。 你想要的是变焦,无法形成规模。 试试这个参考 。



Answer 5:

使用ViewGroup.layout。 这可能是规模(移动)ViewGroup中最简单的方法。



文章来源: Android ViewGroup.setScaleX() cause the view to be clipped