2

現在、私は本当に醜い問題に直面しています。

半透明の子がほとんどない ViewFlipper があります。ViewFlipper の In および Out アニメーションは、それらの子が互いにオーバーレイするように作成されます (つまり、アルファ値が混在します)。子は半透明になるため、その下の背景が表示されるため、それらの子のそれぞれに背景を設定することはできません。

問題は、これらの子を交差させたいということです。後で描画される子は切り取られる必要があります。その必要性に基づいて、ViewFlipper.drawChild メソッドをオーバーライドし、アニメーション変換マトリックスをビュー境界に適用します。次に、以前にカウントされた境界を補完するものを使用して、キャンバスの描画領域をクリップします。それでも、私が何をしても、まだオーバーレイしている小さな長方形のように見えます。それを修正する方法はありますか?

私のコードは次のとおりです。

public class ChartsTabsLayout extends ViewFlipper {
private Rect[] mDrawTMPParent;
private Rect mDrawTMPChild;
private Rect mDrawTMP;
private RectF mDrawTMPRectF;

public ChartsTabsLayout(final Context aContext) {
    super(aContext);
    initialize(aContext, null);
}

public ChartsTabsLayout(final Context aContext, final AttributeSet aAttributes) {
    super(aContext, aAttributes);
    initialize(aContext, aAttributes);
}

private void initialize(final Context aContext, final AttributeSet aAttributes) {
    mDrawTMPParent = new Rect[] { new Rect(), new Rect(), new Rect(), new Rect() };
    mDrawTMPChild = new Rect();
    mDrawTMP = new Rect();
    mDrawTMPRectF = new RectF();
}

@Override
protected void dispatchDraw(final Canvas aCanvas) {
    getDrawingRect(mDrawTMP);
    mDrawTMPParent[0].set(mDrawTMP);
    for(int i = 1; i < 4; i++) {
        mDrawTMPParent[i].setEmpty();
    }
    super.dispatchDraw(aCanvas);
}

private void countRectCompliment(final Rect aInside, final Rect aOutside, final Rect[] aOut) {
    for(int i = 0; i < 4; i++) {
        aOut[i].set(aOutside);
    }
    aOut[0].right = aInside.left;
    aOut[0].top = aInside.top;
    aOut[0].bottom = aInside.bottom;
    aOut[1].left = aInside.right;
    aOut[1].top = aInside.top;
    aOut[1].bottom = aInside.bottom;
    aOut[2].top = aInside.bottom;
    aOut[3].bottom = aInside.top;
    for(int i = 0; i < 4; i++) {
        if(aOut[i].left >= aOut[i].right || aOut[i].top >= aOut[i].bottom) {
            aOut[i].setEmpty();
        }
    }
}

@Override
protected boolean drawChild(final Canvas aCanvas, final View aChild, final long aDrawingTime) {
    final Transformation transformation = new Transformation();
    aChild.getDrawingRect(mDrawTMPChild);
    mDrawTMPRectF.set(mDrawTMPChild);

    final Animation animation = aChild.getAnimation();
    if(animation != null) {
        if(animation.willChangeTransformationMatrix()) {
            //if I change aDrawingTime to aDrawingTime-50 
            //animations seems to look ok, but it is "magic number" 
            //solution I would like to avoid by any means 
            animation.getTransformation(aDrawingTime, transformation); 
            transformation.getMatrix().mapRect(mDrawTMPRectF);
        }
    }
    mDrawTMPRectF.round(mDrawTMPChild);

    boolean ret = true;

    for(int i = 0; i < 4; i++) {
        if(!mDrawTMPParent[i].isEmpty()) {
            aCanvas.save();
            aCanvas.clipRect(mDrawTMPParent[i].left, mDrawTMPParent[i].top, mDrawTMPParent[i].right, mDrawTMPParent[i].bottom);
            ret |= super.drawChild(aCanvas, aChild, aDrawingTime);
            aCanvas.restore();
        }
    }
    countRectCompliment(mDrawTMPChild, mDrawTMPParent[0], mDrawTMPParent);
    return ret;
}
}
4

0 に答える 0