web-dev-qa-db-ja.com

Android API 21未満)でボタンの高さ(影)をエミュレートするにはどうすればよいですか?

私はこの最小限のAndroid Studioプロジェクトにボタンだけがあります。ボタンに影を割り当てます:

Android:elevation="3dp"
Android:translationZ="3dp"
Android:stateListAnimator="@null"

Android Studio Designタブに影が表示されます。しかし、xmlエディターにも警告が表示されます。

Atribute ...はAPIレベル21以上でのみ使用されます(現在の最小値は16です)

実際、ボタンの影はAPI level 21 or higherのエミュレーターでのみ表示され、API level lower than 21のエミュレーターでは影がまったくなく、フラットに表示されます。

したがって、具体的な質問は、API's lower than 21でシャドウ効果をどのようにエミュレートできるかということです。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    xmlns:app="http://schemas.Android.com/apk/res-auto">

    <LinearLayout
        Android:id="@+id/main_layout"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:weightSum="1">

        <RelativeLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_margin="20dp"
            Android:layout_weight="2.24">

            <Button
                Android:id="@+id/my_button"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_centerHorizontal="true"
                Android:layout_marginLeft="20dp"
                Android:layout_marginBottom="20dp"
                Android:elevation="5dp"
                Android:translationZ="5dp"
                Android:stateListAnimator="@null"
                Android:background="@Android:color/holo_green_light"
                Android:text="BUTTON"/>

        </RelativeLayout>
    </LinearLayout>
</ScrollView>

MainActivity.Java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

}

API 22の影を示すボタン: enter image description here

API 16の同じボタンに影が表示されない: enter image description here

8
Ramiro

ために Pre-Lollipopデバイス描画可能なファイルを使用して影または立面図を作成する必要があります。こちらです。

element_background.xmlのようにフォルダにdrawableファイルを作成します

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item>
    <shape Android:shape="rectangle">
        <solid Android:color="#BDBDBD"/>
        <corners Android:radius="5dp"/>
    </shape>
</item>

<item
    Android:left="0dp"
    Android:right="0dp"
    Android:top="0dp"
    Android:bottom="2dp">
    <shape Android:shape="rectangle">
        <solid Android:color="#ffffff"/>
        <corners Android:radius="5dp"/>
    </shape>
</item>
</layer-list>

次に、必要な要素に次のコードを追加します。

Android:background="@drawable/element_background"
10
Ironman

必要に応じて、Carbonを試すことができます。これは、2.2に戻ってマテリアル機能をバックポートするライブラリです。仰角と生成されたアニメーションシャドウもサポートします。

https://github.com/ZieIony/Carbon

6
Zielony