2017-02-22 9 views
0

я не знаю, если этот подход является лучшим, но у меня есть следующая проблема:Установка высота CardView программно

Я хочу элемент списка (а CardView) в RecyclerView анимировать, когда это кнопка была нажата, так что эта кнопка, некоторые другие виды внутри этого элемента и фон CardView меняются.

Я не буду ловить animateChange из пользовательского RecyclerView.ItemAnimator: (до сих пор анимация просто замирание определяется в XML с помощью animateLayoutChanges)

public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder, @NonNull RecyclerView.ViewHolder newHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) { 
    Log.d("Animation", "Test"); 
    final MyAdapter.MyViewHolder viewHolder = (MyAdapter.MyViewHolder) newHolder; 

    viewHolder.mButtons.setVisibility(View.GONE); 
    viewHolder.mHints.setVisibility(View.GONE); 
    viewHolder.mImageView.setVisibility(View.GONE); 

    ViewGroup.LayoutParams layoutParams = viewHolder.containerCardView.getLayoutParams(); 
    layoutParams.height = 192; 
    viewHolder.containerCardView.setLayoutParams(layoutParams); 
    viewHolder.containerCardView.setBackgroundResource(R.drawable.some_background); 
    viewHolder.containerCardView.setElevation(20f); 

    return true; 
} 

Как вы можете видеть, я устанавливаю фона вручную в animateChange. Все работает нормально (или позволяет сказать, по крайней мере, как ожидалось), за исключением высоты карты. Я попытался установить высоту вручную, но нет показанной отметки.

EDIT______

Мой CardView имеет ImageView и кнопку внутри него. При нажатии кнопки сама кнопка и изображение должны исчезать, и на правой стороне картыView должна быть красная линия. Я пытался добиться того, чтобы при установке фона (с setBackgroundResource) к этому:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
<item> 
    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
      android:shape="rectangle"> 
     <gradient 
      android:angle="180" 
      android:centerColor="@android:color/transparent" 
      android:centerX="0.1" 
      android:startColor="@android:color/holo_red_dark"/> 
     <corners 
      android:bottomLeftRadius="2dip" 
      android:bottomRightRadius="2dip" 
      android:topLeftRadius="2dip" 
      android:topRightRadius="2dip"/> 
    </shape> 
</item> 

<item android:right="4dp"> 
    <shape android:shape="rectangle"> 
     <solid android:color="@android:color/white" /> 
    </shape> 
</item> 
</layer-list> 

Что просто XML вытяжка с красной линией справа. У вас есть предложения по другому способу приблизиться к моей цели?

+0

'Я попытался установить высоту вручную, но нет показанного показа.« Что ты имеешь в виду? –

+0

viewHolder.containerCardView.setElevation (20f); Перед тем, как я установил новый фон, cardView имеет высоту раньше, но не. Поэтому я попытался установить его снова с помощью этой строки кода. – Vancore

+0

Почему бы вам просто не установить его в XML? –

ответ

6

setCardElevation, а не setElevation. Второй изменяет свойство elevation, из-за которого все подклассы View имеют Lollipop (уровень API 21).

И НЕ ИСПОЛЬЗОВАТЬsetBackgroundResource: фоновая карты является его высотой (это потому, что карта совместима со всей Android версии до леденца, которые не имеют elevation собственности). Используйте setCardBackgroundColor, чтобы установить цвет фона (или app:cardBackgroundColor в вашем xml).

Если вам нужно фоновое изображение, а не цвет, разместите ImageView внутри вашей карты, как предлагает this answer.

Выполняйте то, что вы хотите, но не назовите метод setBackground... на CardView, иначе вы потеряете тень карты (ее эффект высоты).

Во-вторых, чтобы оживить ваше возвышение использовать следующий код:

ObjectAnimator animator = ObjectAnimator.ofFloat(cardView, "cardElevation", start, end); 
// if needed set duration, interpolator, or what you want on the animator 
animator.start(); 
+0

К сожалению не работает:/ – Vancore

+0

Ваша карта содержится внутри другого макета? Тень высоты может быть просто не видна из-за свойств 'clipChildren' и' clipToPadding' макета контейнера (которые по умолчанию являются «истинными»). – Massimo

+0

Я обновил ответ. У вашего кода есть некоторые проблемы, связанные с неправильным использованием методов 'View'. – Massimo

0

попробовать использовать

cardview.setMaxCardElevation(); 

, но обратите внимание, что:

Calling этот метод не имеет, если устройство эффекта Версия ОС - Lollipop или newer, а getUseCompatPadding() - false.

Или попробуйте

cardview.setCardElevation(); 

Source

Или из XML:

Добавить android:clipChildren="false" родителю вашего cardview или добавить небольшое количество дополнения к вашему просмотра и настройки android:clipToPadding="false"

и использовать

card_view:cardElevation="VALUE" 
+0

clipTopadding и clipChildren, похоже, не влияют на это. Я думаю, что проблема лежит где-то в другом месте. – Vancore

+0

@ Vancore, к сожалению, у меня нет идей! –

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