AppCompat v21을 사용하여 Android에서 FAB (플로팅 작업 버튼)를 만드는 방법은 무엇입니까?


79

Google 캘린더와 같은 플로팅 작업 버튼 (목록보기에 항목을 추가하기 위해)을 만들고 사전 롤리팝 Android 버전 (5.0 이전)과의 호환성을 유지하고 싶습니다.

이 레이아웃을 만들었습니다.

활동 main_activity.xml :

<LinearLayout ... >

     <include
         layout="@layout/toolbar"/>

     <RelativeLayout ... >

     <!-- My rest of the layout -->

          <!-- Floating action button -->
          <ImageButton style="@style/AppTheme"
                     android:layout_width="60dp"
                     android:layout_height="60dp"
                     android:text="New Button"
                     android:id="@+id/button"
                     android:src="@drawable/ic_fab"
                     android:background="@drawable/fab"
                     android:layout_alignParentBottom="true"
                     android:layout_alignParentRight="true"
                     android:layout_marginBottom="24dp"
                     android:layout_marginRight="24dp"/>

     </RelativeLayout>

 </LinearLayout>

드로어 블 fab.xml :

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="oval">
    <solid android:color="#ffa48bc0"/>
</shape>

스타일 styles.xml

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">#ff1d79b1</item>
        <item name="colorPrimaryDark">#ff084d95</item>
    </style>
</resources>

결과는 비슷하지만 머티리얼 디자인의 특징 인 음영이 없습니다.

캘린더의 플로팅 작업 버튼 :

캘린더의 플로팅 작업 버튼

내 앱의 플로팅 작업 버튼 :

내 앱의 플로팅 작업 버튼

버튼에 음영을 추가하려면 어떻게해야합니까?

이미 속성 상승을 사용했지만 작동하지 않습니다.


1
고도 API는 Lollipop 전용입니다. Lollipop 기기를 사용해 보셨습니까?
Marc Plano-Lesay 2014

2
주어진 대답 중 하나를 받아 들일 때일 것입니다.
Phantômaxx

사실 내 4.4.2 Samsung Galaxy S III에서는 AppCompat 덕분에 그림자가 있습니다.
FractalBob

답변:


100

더 이상 자신의 FAB를 만들거나 타사 라이브러리를 사용할 필요가 없으며 AppCompat 22에 포함되었습니다.

https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html

gradle-file에 design이라는 새로운 지원 라이브러리를 추가하기 만하면됩니다.

compile 'com.android.support:design:22.2.0'

... 그리고 당신은 갈 수 있습니다.

<android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_margin="16dp"
        android:clickable="true"
        android:src="@drawable/ic_happy_image" />

1
배경색은 어떻게 바꾸나요?
Jjang

2
기본적으로 배경색은 테마의 "colorAccent"입니다. 그러나 floatingActionButton.setRippleColor (color)를 사용할 수도 있습니다. 'ripple'이라는 이름이 두렵지 않게하세요. 사전 롤리팝 기기에서도 작동합니다.
user1354603

colorAccent가 없으며 하나를 추가하고 색상을 다른 것으로 설정하면 작동하지 않습니다. 색상이 녹색 / 청록색으로 변합니다.
Jjang

나는 이것을 위해 제 3자를 사용하고 있었다. 정말 많은 도움이되었습니다. 감사. 이것의 한 가지 문제는 여전히 완전히 개발되지 않은 것처럼 느껴진다는 것입니다.
V_J

1
@Jjang @ user1354603 문서에서The background color of this view defaults to the your theme's colorAccent. If you wish to change this at runtime then you can do so via setBackgroundTintList(ColorStateList).
무하마드 바바

43

저는 일반적으로 xml 드로어 블을 사용하여 사전 롤리팝 위젯에서 그림자 / 고도를 생성했습니다. 예를 들어 여기에는 플로팅 작업 버튼의 고도를 시뮬레이션하기 위해 롤리팝 이전 기기에서 사용할 수있는 xml 드로어 블이 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:top="8px">
    <layer-list>
        <item>
            <shape android:shape="oval">
                <solid android:color="#08000000"/>
                <padding
                    android:bottom="3px"
                    android:left="3px"
                    android:right="3px"
                    android:top="3px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#09000000"/>
                <padding
                    android:bottom="2px"
                    android:left="2px"
                    android:right="2px"
                    android:top="2px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#10000000"/>
                <padding
                    android:bottom="2px"
                    android:left="2px"
                    android:right="2px"
                    android:top="2px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#11000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#12000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#13000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#14000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#15000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#16000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#17000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
    </layer-list>
</item>
<item>
    <shape android:shape="oval">
        <solid android:color="?attr/colorPrimary"/>
    </shape>
</item>
</layer-list>

대신 ?attr/colorPrimary색상을 선택할 수 있습니다. 다음은 결과 스크린 샷입니다.

여기에 이미지 설명 입력


1
공유 해주셔서 감사합니다. 나는 이것을 다시 만들기 위해 XML 코드를 다시 파헤치는 것이 두려웠다.
Cookster

나는 지금 막 구현했고 그것은 대단합니다. 이상한 것은 단 하나뿐입니다. 전화기를 회전하면 그림자 / 높이가 손실되는 것 같습니다. 그것에 대해 어떤 생각? 사전 저스틴 감사
AMILCAR 엔드 레데

@AmilcarAndrade 좋은 질문입니다. 다른 xml 드로어 블과 비슷한 문제가 발생했지만 실제로 드로어 블 자체에서 비트 맵을 추출하고있었습니다. 이를 해결하기 위해 본질적으로 드로어 블을 싱글 톤으로 사용했습니다. 다시 그려지지 않도록 한 번 설정합니다. 아마도 드로어 블을 정적 변수로 가져와 onCreate에서 배경으로 설정할 수 있습니까?
저스틴 폴라드

또한 매우 쉽게 파급 효과를 추가 할 수있는 개선 사항을 추가했습니다. 아래 코드는 다음과 같습니다.
Amilcar Andrade 2015-04-12

2
향후 참조를 위해,이 그림자와 고도를 피하는 좋은 예입니다 -> curious-creature.com/2008/12/18/avoid-memory-leaks-on-android/...
AMILCAR 엔드 레데



4

@Justin Pollard xml 코드는 정말 잘 작동합니다. 참고로 다음 xml 줄을 사용하여 파급 효과를 추가 할 수 있습니다.

    <item>
    <ripple
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?android:colorControlHighlight" >
        <item android:id="@android:id/mask">
            <shape android:shape="oval" >
                <solid android:color="#FFBB00" />
            </shape>
        </item>
        <item>
            <shape android:shape="oval" >
                <solid android:color="@color/ColorPrimary" />
            </shape>
        </item>
    </ripple>
</item>


0

패딩 및 높이 추가 :

 android:elevation="10dp"
 android:padding="10dp"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.