Использование AlphaAnimation было бы отличным решением для большинства переходов и, безусловно, сработало бы для меня, если бы я не смог найти способ сделать именно то, что я пытался сделать, что включает в себя постепенное замирание между двумя представлениями поэтапно на основе на угол наклона устройства. К счастью, у меня есть! Вот стратегия, которую я выбрал: я обернул представление в собственный подкласс FrameLayout и реализовал onDraw. Там я захватил дочернее представление как растровое изображение, а затем перерисовал растровое изображение с предполагаемой альфа-версией. Вот код Я отредактирую, когда меня почистят, это всего лишь подтверждение концепции, но она работает как шарм:
public class AlphaView extends FrameLayout {
private int alpha = 255;
public AlphaView(Context context) {
super(context);
setWillNotDraw(false);
}
public AlphaView(Context context, AttributeSet attrs) {
super(context, attrs);
setWillNotDraw(false);
}
public AlphaView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setWillNotDraw(false);
}
public void setCustomAlpha(int alpha) {
if (this.alpha != alpha) {
this.alpha = alpha;
invalidate();
}
}
public int getCustomAlpha() {
return alpha;
}
@Override
protected void onDraw(Canvas canvas) {
for(int index = 0; index < getChildCount(); index++ ) {
View child = getChildAt(index);
child.setVisibility(View.INVISIBLE);
child.setDrawingCacheEnabled(true);
Bitmap bitmap = child.getDrawingCache(true);
bitmap = Bitmap.createBitmap(bitmap);
child.setDrawingCacheEnabled(false);
Paint paint = new Paint();
paint.setAlpha(alpha);
canvas.drawBitmap(bitmap, 0, 0, paint);
}
}
}