java – Android ViewGroup.setScaleX()导致视图被剪裁

我使用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;
}
上一篇:面试一问:关于 View测量、布局及绘制原理


下一篇:Android的View体系(六):梳理总结View绘制的全流程