カスタムのアニメーション化された ViewGroup があります ( SlidingTabに大きく基づいています)。
私のアプリでは、SlidingTab (ロック画面のスライダー) と同じように動作する単一の TextView にこれを削除しました。これはうまく機能しますが、スライドする TextView はコードで定義されています。代わりにスライドする RelativeLayout 全体が必要です。
さまざまなことを試みているあらゆる種類の投稿を見てきましたが、まだ機能していません。RelativeLayout xml ファイルはインフレートされ、Slider コンストラクターで「親」の子として追加される必要がありますが、measure() および layout() メソッドも実行できる必要があります。以下の関連コードを参照してください。
public class SlindingView extends ViewGroup {
private static Slider mLeftSlider;
private static int tabWidth;
/**
* Simple container class for all things pertinent to a slider.
*/
private static class Slider {
private final TextView tab;
Slider(ViewGroup parent) {
// Want to change 'tab' to a RelativeLayout in xml
tab = new TextView(parent.getContext());
tab.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.FILL_PARENT));
tab.setText("SLIDE THIS");
parent.addView(tab);
}
void layout(int l, int t, int r, int b) {
tabWidth = getTabWidth();
int tabHeight = getTabHeight();
tab.layout(0, 0, tabWidth, tabHeight);
}
public void measure() {
tab.measure(View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
}
public int getTabWidth() {
return tab.getMeasuredWidth();
}
public int getTabHeight() {
return tab.getMeasuredHeight();
}
}
/**
* Constructor
*/
public SlindingView(Context context, AttributeSet attrs) {
super(context, attrs);
mLeftSlider = new Slider(this);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
mLeftSlider.measure();
final int leftTabWidth = mLeftSlider.getTabWidth();
final int leftTabHeight = mLeftSlider.getTabHeight();
final int width = Math.max(widthSpecSize, leftTabWidth);
final int height = leftTabHeight;
setMeasuredDimension(width, height);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
mLeftSlider.layout(l, t, r, b);
}
}