2016-12-10 3 views
0

Привет, ребята, я все еще новичок в Android, и я пытаюсь создать небольшой проект для тестирования. Я пытаюсь создать карточную игру. Для нижнего игрока я хочу отобразить ресайклинг со всеми картами в руке. Я хочу, чтобы изображения карт перекрывались друг с другом и когда игралась карта, чтобы пересчитать перекрытие, чтобы соответствовать ширине родительского вида ресайклера. И когда сумма ширины карты меньше ширины просмотров ресайклера, я хочу, чтобы они отображались без перекрытия и центра в режиме просмотра.Как создать автоматически изменяемый размер изображения в обзоре recycler

Я просто не могу узнать, какой метод использовать. Я использую ItemDecoration для создания перекрытия, но когда я добавляю overlapping match_parent, это не работает.

Это мой обзор для игры.

<RelativeLayout> 
    <!-- Bottom Player --> 
    <LinearLayout android:id="@+id/bottom" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_alignParentBottom="true" 
     android:layout_below="@+id/middle_section" 
     android:orientation="vertical" 
     android:paddingLeft="2dip" 
     android:paddingRight="2dip"> 

     <TextView android:id="@+id/player1_name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" /> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/player1_cards_container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="center" /> 
    </LinearLayout> 
</RelativeLayout> 

Это игрок рука расположение:

<android.support.v7.widget.CardView 
android:id="@+id/player_hand" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageView 
     android:id="@+id/player_card" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:adjustViewBounds="true" /> 

</RelativeLayout> 
</android.support.v7.widget.CardView> 

Тогда у меня есть вид утилизатор адаптер:

public class PlayerHandRecyclerViewAdapter extends  RecyclerView.Adapter<PlayerHandRecyclerViewHolder> { 
private ArrayList<Card> _cards = new ArrayList<Card>(); 
private Context _context; 

public PlayerHandRecyclerViewAdapter(Context context, ArrayList<Card> cards) { 
    this._context = context; 
    this._cards = cards; 
} 

@Override 
public PlayerHandRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    //Inflate the layout, initialize the View Holder 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.player_hand, parent, false); 
    PlayerHandRecyclerViewHolder holder = new PlayerHandRecyclerViewHolder(v, parent); 
    return holder; 

} 

@Override 
public void onBindViewHolder(PlayerHandRecyclerViewHolder holder, int position) { 
    int width = holder.playerHandView.getWidth(); 
    int height = holder.playerHandView.getHeight(); 
    //Use the provided View Holder on the onCreateViewHolder method to populate the current row on the RecyclerView 
    holder.imageView.setImageResource(_cards.get(position).getImageResourceId()); 
} 

@Override 
public int getItemCount() { 
    //returns the number of elements the RecyclerView will display 
    return _cards.size(); 
} 

@Override 
public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
    super.onAttachedToRecyclerView(recyclerView); 
} 

// Insert a new item to the RecyclerView on a predefined position 
public void insert(int position, Card card) { 
    _cards.add(position, card); 
    notifyItemInserted(position); 
} 

// Remove a RecyclerView item containing a specified Data object 
public void remove(Card card) { 
    int position = _cards.indexOf(card); 
    _cards.remove(position); 
    notifyItemRemoved(position); 
} 

} 

Тогда у меня есть держатель:

public class PlayerHandRecyclerViewHolder extends RecyclerView.ViewHolder { 

RecyclerView playerHandView; 
CardView cv; 
ImageView imageView; 

PlayerHandRecyclerViewHolder(View itemView, ViewGroup parent) { 
    super(itemView); 

    String parentId = String.valueOf(parent.getId()); 
    int resId = parent.getContext().getResources().getIdentifier(parentId, "id", parent.getContext().getPackageName()); 
    playerHandView = (RecyclerView) parent.findViewById(resId); 
    cv = (CardView) itemView.findViewById(R.id.player_hand); 
    imageView = (ImageView) itemView.findViewById(R.id.player_card); 
} 
} 

И это мой класс украшения предмета

public class PlayerHandRecyclerViewDecoration extends RecyclerView.ItemDecoration { 
private final static int vertOverlap = -20; 

@Override 
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
    int position = parent.getChildAdapterPosition(view); 
    if (position != 0) { 
     outRect.right = vertOverlap; 
     view.invalidate(); 
    } 
} 
} 
+0

Я думаю, что вы действительно хотите построить LayoutManager, а не ItemDocoration. – Karakuri

+0

@ Karakuri Да, похоже, что я делал это неправильно, я обратился к расширению LinearLayoutManager, теперь проблема заключается в том, что когда я использую обертку для просмотра изображения карты и перекрытия, я вижу только 5 изображений, потому что их начальная ширина больше, чем ширина родителя. –

+0

public void onLayoutChildren (RecyclerView.Recycler recycler, RecyclerView.State state) { super.onLayoutChildren (recycler, state); int childCount = getChildCount(); if (childCount> 0) { for (int i = 1; i

ответ

0

Вы можете создать собственный ImageView, такие как:

public class DynamicHeightImageView extends ImageView { 

    private double mHeightRatio; 

    public DynamicHeightImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public DynamicHeightImageView(Context context) { 
     super(context); 
    } 

    public void setHeightRatio(double ratio) { 
     if (ratio != mHeightRatio) { 
      mHeightRatio = ratio; 
      requestLayout(); 
     } 
    } 

    public double getHeightRatio() { 
     return mHeightRatio; 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     if (mHeightRatio > 0.0) { 
      // set the image views size 
      int width = MeasureSpec.getSize(widthMeasureSpec); 
      int height = (int) (width * mHeightRatio); 
      setMeasuredDimension(width, height); 
     } 
     else { 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     } 
    } 
} 

Вы должны позвонить setHeightRatio() и перейти к нему отношение, которое можно вычислить из данного полученного изображения.

В файле макета вы можете просто заменить ImageView с DynamicHeightImageView, как показано ниже:

<com.......DynamicHeightImageView 
     /> 

Изображение теперь корректировки на основе высоты любого изображения.

Смежные вопросы