8

我使用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

mScale < 1.0: 缩放/缩放有效,但布局被剪裁

mScale < 1.0

我该如何解决这个问题?

编辑:这张照片是在 ICS 上拍摄的。所以我不认为这是 NineOldAndroids 的问题。

4

5 回答 5

4

您的视图的父级必须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;
}
于 2014-05-14T10:19:27.570 回答
3

万一有人遇到和我一样的情况。我最终使用了这种方法:

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);
}
于 2012-11-13T22:12:06.843 回答
1

从 API 级别 11 开始,View该类具有setScaleX()setScaleY()方法,它们可以按预期工作,并且还可以缩放缩放视图的子视图。所以,如果这对你来说是一种方式,请放下图书馆,然后做

v.setScaleX(mScale);
v.setScaleY(mScale);
于 2012-09-14T05:42:35.387 回答
0

如果我正确理解您的问题,您正在缩放视图组并期望包含的视图相应地缩放。它不是那样工作的:你缩放视图组,它会改变大小,但它的子视图不会。

只需缩放所有子视图。即便如此,我不确定文本和图像是否会自动缩放。你想要的是缩放,而不是缩放。试试这个参考

于 2012-09-13T18:35:04.960 回答
0

使用 ViewGroup.layout。这可能是缩放(&移动)ViewGroup 的最简单方法。

于 2013-01-23T15:10:55.743 回答