Android TV ImageViewCard 布局边距变化

Posted

技术标签:

【中文标题】Android TV ImageViewCard 布局边距变化【英文标题】:Android TV ImageViewCard Layout margin change 【发布时间】:2016-06-24 23:51:07 【问题描述】:

我一直在开发一个 android 电视应用程序。我在 BrowserFragment 类中填充了电影列表。我有一个使用 ImageCardView 显示电影缩略图的演示者类。我正在尝试在 Selected 上自定义 imagecardview。我希望它看起来像这里的图片。在选择特定的 ImageCardView 时,缩略图的大小会增加,但基本对齐方式应该与 pic 中所示的其他未选中的相同。

编辑图片链接https://www.dropbox.com/s/habpjnrlwh1se8v/sample.png?dl=0

编辑演示者类

public class CardPresenter extends Presenter 
private int mSelectedBackgroundColor = -1;
private int mDefaultBackgroundColor = -1;
private Drawable mDefaultCardImage;

class ViewHolder extends Presenter.ViewHolder 
    HashMap<Integer,Object> ObjectsList=new HashMap<>();
    public ViewHolder(View view) 
        super(view);
    


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) 
    mDefaultBackgroundColor = R.color.default_background;
    mSelectedBackgroundColor = R.color.selected_background;
    mDefaultCardImage = parent.getResources().getDrawable(R.drawable.lb_card_shadow_focused, null);

    ImageCardView cardView = new ImageCardView(parent.getContext()) 
        @Override
        public void setSelected(boolean selected) 
            updateCardBackgroundColor(this, selected);
            super.setSelected(selected);
        
    ;

    cardView.setFocusable(true);
    cardView.setFocusableInTouchMode(true);
    updateCardBackgroundColor(cardView, false);
    return new ViewHolder(cardView);


private void updateCardBackgroundColor(ImageCardView view, boolean selected) 
    int color = selected ? mSelectedBackgroundColor : mDefaultBackgroundColor;

    // Both background colors should be set because the view's
    // background is temporarily visible during animations.

    view.setBackgroundColor(color);
    view.findViewById(R.id.info_field).setBackgroundColor(color);


@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) 
    Movie movie = (Movie) item;

    ImageCardView cardView = (ImageCardView) viewHolder.view;
    cardView.setTitleText(movie.getName());
    cardView.setContentText(movie.getCategory());

    if (movie.getImgResUrl() != 0) 
        // Set card size from dimension resources.
        Resources res = cardView.getResources();
//            int width = res.getDimensionPixelSize(R.dimen.card_width);
//            int height = res.getDimensionPixelSize(R.dimen.card_height);
        cardView.setMainImageDimensions(300, 300);

        Glide.with(cardView.getContext())
                .load(movie.getImgResUrl())
                .error(mDefaultCardImage)
                .into(cardView.getMainImageView());
    


@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) 
    ImageCardView cardView = (ImageCardView) viewHolder.view;

    // Remove references to images so that the garbage collector can free up memory.
    cardView.setBadgeImage(null);
    cardView.setMainImage(null);


任何帮助将不胜感激。谢谢

【问题讨论】:

请添加参考图像或添加具有图像卡视图的演示者类代码。 @jaydroider 我没有足够的声誉来发布图片,所以我添加了指向示例图片的链接 请发布您的演示者课程代码。 目前使用此代码,您的列表行布局看起来如何。你能解释一下吗? 是的,我有一排电影缩略图,我可以垂直向下滚动。每一行都有不同的类别,如喜剧、动作冒险。添加这些类别只是为了名字。 【参考方案1】:

试试这个方法。

在你的 View Holder 类中修改这个。

class ViewHolder extends Presenter.ViewHolder 
   private ImageCardView mCardView;
   private Drawable mDefaultCardImage;
   private PicassoImageCardViewTarget mImageCardViewTarget;
   HashMap<Integer,Object> ObjectsList=new HashMap<>();

   public ViewHolder(View view) 
        super(view);
        mCardView = (ImageCardView) view;
        mImageCardViewTarget = new PicassoImageCardViewTarget(mCardView);
    

    protected void updateCardViewImage(URI uri) 
        Picasso.with(mContext)
                .load(uri.toString())
                .resize(Utils.convertDpToPixel(mContext, CARD_WIDTH),
                        Utils.convertDpToPixel(mContext, CARD_HEIGHT))
                .error(mDefaultCardImage)
                .into(mImageCardViewTarget);
    

应该在 Presenter 类中全局定义卡片宽度和卡片高度。

private static int CARD_WIDTH = 323;
private static int CARD_HEIGHT = 146;

然后像这样在 onBindViewHolder 中调用它。

if (movie.getImgResUrl() != 0) 
    Resources res = cardView.getResources();
    ((ViewHolder) viewHolder).mCardView.setMainImageDimensions(CARD_WIDTH, CARD_HEIGHT);
    ((ViewHolder) viewHolder).updateCardViewImage(movie.getCardImageURI());

不要忘记在 Build.Gradle 文件中添加它。

compile 'com.squareup.picasso:picasso:2.3.2'

希望这会对你有所帮助。

【讨论】:

不,我还没有尝试过。我将注意力转移到获取和使用网络服务上。完成后,我会尝试你的想法,然后告诉你

以上是关于Android TV ImageViewCard 布局边距变化的主要内容,如果未能解决你的问题,请参考以下文章

Android TV开发焦点移动源码分析

Android TV开发总结TV上屏幕适配总结

Android TV 应用无法安装在 Android TV 设备上

Smart TV、Android TV 和 Fire TV 的一种语言

Android TV:如何使用 Leanbak 自定义 android TV 的左侧导航面板?

Android-TV 应用显示白屏