Android Studio で新しい TV プロジェクトのデモを変更して、次の要件を満たします。
1. 上部の背景領域を削除します
2. 中央詳細領域の高さを変更する
3. バックグラウンドインターフェイス全体を変更する
効果は次の図に示すとおりです。
インターネット中を検索しましたが、解決策が見つかりませんでした。コードを見て実装をカスタマイズすることによってのみ、自分自身をテストできます。
1. 上部の背景領域を削除します。
VideoDetailsFragment の setupDetailsOverviewRowPresenter メソッドを書き換えて、alignDefs の 1 つを削除します。
@Override
protected void setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter presenter) {
ItemAlignmentFacet facet = new ItemAlignmentFacet();
// by default align details_frame to half window height
ItemAlignmentFacet.ItemAlignmentDef alignDef = new ItemAlignmentFacet.ItemAlignmentDef();
alignDef.setItemAlignmentViewId(androidx.leanback.R.id.details_frame);
alignDef.setItemAlignmentOffset(0);
alignDef.setItemAlignmentOffsetPercent(0);
ItemAlignmentFacet.ItemAlignmentDef[] defs =
new ItemAlignmentFacet.ItemAlignmentDef[] {alignDef};
facet.setAlignmentDefs(defs);
presenter.setFacet(ItemAlignmentFacet.class, facet);
}
完了後のエフェクトを見ると、左上に見苦しい戻るボタンがあり、クリックしても反応がありません。この戻りアイコンは必要ありません。showTitle メソッドを積極的に呼び出した場合、効果がないことがわかります。ここでは、他のクラスがどのように値を割り当てても、メソッドを書き直して、タイトル バーに戻ると、戻るボタン アイコンが表示されなくなります。
@Override
public void showTitle(boolean show) {
super.showTitle(false);
}
2. 中央の詳細領域の高さを変更します。
FullWidthDetailsOverviewRowPresenter クラスをカスタマイズし、そのクラスの高さを変更します。
public class MyDetailsOverviewRowPresenter extends FullWidthDetailsOverviewRowPresenter {
public MyDetailsOverviewRowPresenter(Presenter detailsPresenter) {
super(detailsPresenter);
}
@Override
protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
ViewHolder viewHolder = (ViewHolder) super.createRowViewHolder(parent);
ViewGroup overviewView = viewHolder.getOverviewView();
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) overviewView.getLayoutParams();
layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
overviewView.setLayoutParams(layoutParams);
overviewView.setPadding(0,0,0,50); //底部给点边距,不然很难看
return viewHolder;
}
@Override
protected void onLayoutOverviewFrame(ViewHolder viewHolder, int oldState, boolean logoChanged) {
super.onLayoutOverviewFrame(viewHolder, oldState, logoChanged);
//重写这个方法为了解决图片位置偏上的问题
ViewGroup.MarginLayoutParams lpFrame =
(ViewGroup.MarginLayoutParams) viewHolder.getOverviewView().getLayoutParams();
lpFrame.topMargin = 0;
viewHolder.getOverviewView().setLayoutParams(lpFrame);
}
}
次に、VideoDetailsFragment 内の元のインスタンス化を置き換えます。
private void setupDetailsOverviewRowPresenter() {
// 替换我们的自定义类
FullWidthDetailsOverviewRowPresenter detailsPresenter =
new MyDetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
//设置背景透明
detailsPresenter.setBackgroundColor(ContextCompat.getColor(requireContext(),R.color.transparent));
//设置action栏背景不透明
detailsPresenter.setActionsBackgroundColor(ContextCompat.getColor(requireContext(),R.color.default_background));
//设置详情没有选中效果,不然选中会有个半透白色前景色
detailsPresenter.setSelectEffectEnabled(false);
// Hook up transition element.
FullWidthDetailsOverviewSharedElementHelper sharedElementHelper =
new FullWidthDetailsOverviewSharedElementHelper();
......
3. バックグラウンド インターフェイス全体を変更します。
元々はmDetailsBackgroundで背景を設定していたのですが、上・中・下で背景が分かれていたので、ここで完全な背景を作りたかったのです。
VideoDetailsFragment の親クラス、DetailsSupportFragment を確認してください。これには setBackgroundDrawable メソッドがありますが、パブリックではないため、呼び出すことができません。オリジナルのものは必要ないので、このインターフェースの rootView を見つけて背景を設定します。
onCreateView をオーバーライドします。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = super.onCreateView(inflater, container, savedInstanceState);
rootView.findViewById(androidx.leanback.R.id.details_fragment_root)
.setBackground(ContextCompat.getDrawable(requireContext(),R.drawable.image1));
return rootView;
}
元の背景ステートメントを削除します。
mDetailsBackground関連のコードをコメントアウトすればOKですが、コメントアウトしないとmDetailsBackground.enableParallax()メソッドが実行されて背景が黒くなります。