現在、私は本当に醜い問題に直面しています。
半透明の子がほとんどない 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;
}
}