2017-02-22 24 views
0

このアプローチが最善である場合、私は知りませんが、私は次のような問題があります。設定CardView標高プログラムで

私はそれがボタンだがクリックされた時にアニメーション化するRecyclerViewにリスト項目(CardViewを)したいです、このボタン、このアイテム内のいくつかの他のビュー、およびCardViewの背景が変更されます。

私はカスタムRecyclerView.ItemAnimatorからanimateChangeをキャッチしています:あなたが見ることができるように (今までのアニメーションがanimateLayoutChangesを経由して、XMLで定義されているだけでフェードです)

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を実行します。 CardViewの標高を除いて、すべてうまく動作します(または少なくとも予想どおり)。標高を手で設定しようとしましたが、標高は表示されていません。

EDIT______

私のCardViewはImageViewのと、それ内部のボタンがあります。ボタンを押すと、ボタン自体と画像が消えて、カードビューの右側に赤い線が表示されます。私はこれまで(setBackgroundResource付き)背景を設定することにより、それを達成しようとした:

右側の赤い線とだけのxml描画可能である
<?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> 

。私の目標に近づく別の方法の提案はありますか?

+0

「手で標高を設定しようとしましたが、標高が表示されていません」とはどういう意味ですか? –

+0

viewHolder.containerCardView.setElevation(20f);カードビューの前に仰角がありますが、新しい背景を設定した後ではありません。だから私はこのコード行でもう一度設定しようとしました。 – Vancore

+0

XMLで設定するのはなぜですか? –

答えて

6

setElevationではなくsetCardElevationに電話する必要があります。 2番目のプロパティは、elevationというプロパティを変更します。ViewのサブクラスはすべてLollipop(APIレベル21)以降のものです。カードの背景は、その標高がある(このカードがelevation性質を持っていないロリポップ前にすべてのAndroidのバージョンと互換性があるため):

そしてsetBackgroundResource使用しないでください。 setCardBackgroundColorを使用して、背景色(またはxmlにapp:cardBackgroundColor)を設定します。

色ではなく背景のイメージが必要な場合は、this answerが示すように、カードの内部にImageViewを入れます。

setBackground...メソッドをCardViewにコールしないでください。そうしないと、カードシャドウ(高度効果)が失われます。第二に

、あなたの標高は、次のコードを使用しアニメーション化する:

cardview.setMaxCardElevation(); 

を使用するが、それを注意する

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'プロパティ(デフォルトでは 'true')のため、標高影は単に見えません。 – Massimo

+0

私は答えを更新しました。あなたのコードには、 'View'メソッドの間違った使い方に関するいくつかの問題があります。 – Massimo

0

試して:デバイス場合は、このメソッドを呼び出すと

は効果がありませんOSのバージョンはLollipopまたは で、getUseCompatPadding()はfalseです。

それとも

cardview.setCardElevation(); 

Source

またはXMLからを試してみてください。

はあなたのcardviewの親にandroid:clipChildren="false"を追加したり、ビューとセットにパディングの少量を追加android:clipToPadding="false"

と使用

card_view:cardElevation="VALUE" 
+0

clipTopaddingとclipChildrenはこれに何の効果もないようです。私は問題がどこかにあると思う。 – Vancore

+0

@Vancore残念ながら私はアイデアがありません! –

関連する問題