Android TV: Leanback の VideoDetailsFragment のカスタマイズ

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 の親クラス、DetailsS​​upportFragment を確認してください。これには 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()メソッドが実行されて背景が黒くなります。

おすすめ

転載: blog.csdn.net/qq_35584878/article/details/131535333