私はListViewを持っています、そして各リスト項目でそれの下に影を見せたいです。私はAndroid Lollipopの新しい標高機能を使用して、影を落としたいZをビューに設定しています。すでにActionBar(厳密にはLollipopのツールバー)を使ってこれを効果的に行っています。 Lollipopの標高を使用していますが、何らかの理由でリスト項目の下に影が表示されません。各リストアイテムのレイアウトは次のように設定されています。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:orientation="vertical"
style="@style/block"
Android:gravity="center"
Android:layout_gravity="center"
Android:background="@color/lightgray"
>
<RelativeLayout
Android:layout_width="300dp"
Android:layout_height="300dp"
Android:layout_marginLeft="40dp"
Android:layout_marginRight="40dp"
Android:layout_marginTop="20dp"
Android:layout_marginBottom="20dp"
Android:elevation="30dp"
>
<ImageView
Android:id="@+id/documentImageView"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:scaleType="centerCrop" />
<LinearLayout
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/alphared"
Android:layout_alignParentBottom="true" >
<appuccino.simplyscan.Extra.CustomTextView
Android:id="@+id/documentName"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textColor="@color/white"
app:typeface="light"
Android:paddingLeft="16dp"
Android:paddingTop="8dp"
Android:paddingBottom="4dp"
Android:singleLine="true"
Android:text="New Document"
Android:textSize="27sp"/>
<appuccino.simplyscan.Extra.CustomTextView
Android:id="@+id/documentPageCount"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textColor="@color/white"
app:typeface="italic"
Android:paddingLeft="16dp"
Android:layout_marginBottom="16dp"
Android:text="1 page"
Android:textSize="20sp"/>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
しかし、これはリスト項目を影なしで表示する方法です。
私は無駄にするために次のことも試みました:
私はLollipopで少し影をかけて遊んでいましたが、これが私が見つけたものです:
ViewGroup
の境界が何らかの理由でその子の影をカットオフしているようです。そしてAndroid:elevation
で設定された影は、View
の境界によってカットオフされます。マージンを超えて拡張される境界ではありません。Android:clipToPadding="false"
を設定することです。これは私が知っていることに基づいたあなたへの私の提案です:
RelativeLayout
を、影を付けたい相対レイアウトで設定した余白と同じ余白になるように設定します。Android:clipToPadding="false"
を同じRelativeLayout
に設定します。RelativeLayout
からマージンを削除します。一日の終わりには、あなたのトップレベルの相対的なレイアウトはこのようになるはずです。
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
style="@style/block"
Android:gravity="center"
Android:layout_gravity="center"
Android:background="@color/lightgray"
Android:paddingLeft="40dp"
Android:paddingRight="40dp"
Android:paddingTop="20dp"
Android:paddingBottom="20dp"
Android:clipToPadding="false"
>
内部の相対レイアウトは次のようになります。
<RelativeLayout
Android:layout_width="300dp"
Android:layout_height="300dp"
Android:background="[some non-transparent color]"
Android:elevation="30dp"
>
あなたが背景のないビューを持っているなら、この行はあなたを助けるでしょう
Android:outlineProvider="bounds"
デフォルトでは影はビューの背景によって決定されるため、背景がない場合は影もありません。
どうやら、あなたは単にビューに標高を設定してそれを表示させることはできません。背景も指定する必要があります。
私のLinearLayoutに追加された次の行はついに影を示しました:
Android:background="@Android:color/white"
Android:elevation="10dp"
もう1つ注意しておくべきことは、この行がマニフェストに含まれていると影が表示されないことです。
アンドロイド:hardwareAccelerated = "false"
提案されたものをすべて試しましたが、行を削除したときにしか機能しませんでした。行を持っていたのは、私のアプリが多数のビットマップイメージで動作し、それらが原因でアプリがクラッシュしたためです。
ボタン要素に標高を追加する場合は、次の行を追加する必要があります。
Android:stateListAnimator="@null"
参照してください Android 5.0 Android:elevation表示機能はありますが、ボタン機能はありませんか。
あなたが背景のないビューを持っているなら、この行はあなたを助けるでしょう
Android:outlineProvider="bounds"
あなたが背景を持つビューを持っているならば、この行はあなたを助けるでしょう
Android:outlineProvider="paddedBounds"
うーん、これを理解するために1時間だけ費やした。私の場合、私は背景を設定しましたが、それは色に設定されていました。これだけでは不十分です。ビューの背景を描画可能オブジェクトに設定する必要があります。
例えばこれに影はありません。
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="165dp"
Android:background="@color/ight_grey"
Android:elevation="20dp"
Android:orientation="vertical"
/>
しかしこれは
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="165dp"
Android:background="@drawable/selector_grey"
Android:elevation="20dp"
Android:orientation="vertical"
/>
編集:あなたが背景としてセレクタを使用している場合、あなたがコーナーを設定していない場合は影が プレビューウィンドウ に表示されませんが、それはデバイスに表示されます
例えばこれはプレビューに影がありません。
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape Android:shape="rectangle">
<solid Android:color="@color/white" />
<stroke
Android:width="1dp"
Android:color="@color/grey"/>
</shape>
</item>
</selector>
しかし、これはしません:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape Android:shape="rectangle">
<solid Android:color="@color/white" />
<corners Android:radius="1dp" />
<stroke
Android:width="1dp"
Android:color="@color/grey"/>
</shape>
</item>
</selector>
背景色を追加すると私は役に立ちました。
<CalendarView
Android:layout_width="match_parent"
Android:id="@+id/calendarView"
Android:layout_alignParentTop="true"
Android:layout_alignParentStart="true"
Android:layout_height="wrap_content"
Android:elevation="5dp"
Android:background="@color/windowBackground"
/>
background="@color/***"
やbackground="#ff33**"
がうまく動かないような時は、私はbackground_color
をdrawableに置き換えます、そしてそれはうまくいきます
透明な背景にしたいのにAndroid:outlineProvider="bounds"
がうまくいかない場合は、カスタムViewOutlineProviderを作成できます。
class TransparentOutlineProvider extends ViewOutlineProvider {
@Override
public void getOutline(View view, Outline outline) {
ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
Drawable background = view.getBackground();
float outlineAlpha = background == null ? 0f : background.getAlpha()/255f;
outline.setAlpha(outlineAlpha);
}
}
そしてこのプロバイダをあなたの透明なビューに設定してください。
transparentView.setOutlineProvider(new TransparentOutlineProvider());
出所: https://code.google.com/p/Android/issues/detail?id=78248#c13
[編集] Drawable.getAlpha()のドキュメントは、Drawableがアルファをどのように脅かしているかに特有のものであると述べています。常に255が返される可能性があります。この場合は、手動でアルファを指定できます。
class TransparentOutlineProvider extends ViewOutlineProvider {
private float mAlpha;
public TransparentOutlineProvider(float alpha) {
mAlpha = alpha;
}
@Override
public void getOutline(View view, Outline outline) {
ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
outline.setAlpha(mAlpha);
}
}
ビューの背景がデフォルトカラー#DDFF0000のStateListDrawableで、アルファDDx0/FFx0 == 0.86の場合
transparentView.setOutlineProvider(new TransparentOutlineProvider(0.86f));
私のために働いたレイアウトにいくつかの背景色を与えるように:
Android:background="@color/catskill_white"
Android:layout_height="?attr/actionBarSize"
Android:elevation="@dimen/dimen_5dp"
承認された答えに加えて、昇格が期待どおりに機能しない可能性があるため、もう1つの理由があります。
電話機のブルーライトフィルタ機能がオンの場合
私の装置では標高が完全に歪んで耐え難いように見えたとき、私はこの問題に直面していました。しかし、標高はプレビューで大丈夫だった。電話機のブルーライトフィルタをオフにすると、問題は解決しました。
設定後もそう
Android:outlineProvider="bounds"
標高が正しく機能していない場合は、携帯電話の色設定を変更することができます。
それでも標高が表示されない場合
Android:hardwareAccelerated="true"
これは間違いなくあなたを助けます。
私の場合、これはカスタムの親コンポーネントがレンダリングレイヤタイプを "Software"に設定したことが原因です。
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
この行を削除するとうまくいきます。それとも、なぜこれがそもそもあるのかを評価する必要があります。私の場合は、Honeycombをサポートすることでした。これは、私のプロジェクトの現在の最小SDKの裏にあります。
私はあなたの問題はあなたがその親を満たす相対的なレイアウトにelevation要素を適用したという事実から生じると信じています。その親は、それ自身の描画キャンバス内のすべての子ビューを切り取ります(そして、子の影を処理するビューです)。ビューxml(ルートタグ)の一番上のRelativeLayout
にelevationプロパティを適用することでこれを修正できます。
私の場合はフォントが問題でした。
1)fontFamily
がなければAndroid:background
を何らかの値に設定する必要がありました。
<TextView
Android:layout_width="match_parent"
Android:layout_height="44dp"
Android:background="@Android:color/white"
Android:elevation="3dp"
Android:gravity="center"
Android:text="@string/fr_etalons_your_tickets"
Android:textAllCaps="true"
Android:textColor="@color/blue_4" />
2)fontFamily
でAndroid:outlineProvider="bounds"
設定を追加しなければなりませんでした:
<TextView
Android:fontFamily="@font/gilroy_bold"
Android:layout_width="match_parent"
Android:layout_height="44dp"
Android:background="@Android:color/white"
Android:elevation="3dp"
Android:gravity="center"
Android:outlineProvider="bounds"
Android:text="@string/fr_etalons_your_tickets"
Android:textAllCaps="true"
Android:textColor="@color/blue_4" />
私は親のレイアウトにclipChildren="false"
を設定することでいくらか運が良かった。
私はそれに取り組んでしばらく時間を費やし、そして最後に、背景が暗い時には影が見えないことに気付きました。