ActionBar рдХреЛ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдкрд░ рд▓реЗ рдЬрд╛рдПрдВ

рдирд╡рдВрдмрд░ 2012 рдореЗрдВ рд╡рд╛рдкрд╕, рдореИрдВрдиреЗ рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрд╛ рдЬрд┐рд╕рдХрд╛ рд╢реАрд░реНрд╖рдХ рдерд╛ " рдПрдХреНрд╢рдирдмреЗрд░ рдСрди рдж рдореВрд╡ ред" рдпрд╣ рд▓реЗрдЦ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реБрдВрджрд░ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ ActionBar рдЪреЗрддрди рдХрд░рдиреЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреБрдЫ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ ActionBar рдПрдиреАрдореЗрд╢рди рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкреНрд▓реЗ рд╕реНрдЯреЛрд░ рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреЗрдЦрд╛ред

Google I / O рдкрд░ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдореБрдЭреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд┐рд▓рд╛ рдЬреЛ ActionBar рдореЗрдВ рдПрдХ рдПрдиреАрдореЗрд╢рди рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЪрд▓реЛ рдИрдорд╛рдирджрд╛рд░ рд╣реЛ, рдпрд╣ рд╕рдЪрдореБрдЪ рдореЗрд░рд╛ рджрд┐рдорд╛рдЧ рдЙрдбрд╝рд╛ рджрд┐рдпрд╛ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ рджреЗрдЦрд╛ред рдореБрдЭреЗ рдПрдХ рдЕрдЪреНрдЫреЗ, рд╕реВрдХреНрд╖реНрдо рдФрд░ рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рдПрдирд┐рдореЗрдЯреЗрдб рдкреНрд░рднрд╛рд╡ рд╕реЗ рдкреНрдпрд╛рд░ рд╣реЛ рдЧрдпрд╛, рдФрд░ рд╢рд╛рдпрдж рдЦреБрдж рд╕реЗ рднреА рдЬреНрдпрд╛рджрд╛! рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ Google I / O рдХреЗ рджреМрд░рд╛рди рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ Play Music рдРрдк рд╣реИ!

рдкреНрд▓реЗ рдореНрдпреВрдЬрд╝рд┐рдХ (v5.0) рдХреЗ рдирд╡реАрдирддрдо рдЕрдкрдбреЗрдЯ рдореЗрдВ рдХрд▓рд╛рдХрд╛рд░ рдФрд░ рдПрд▓реНрдмрдо рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд░реАрдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рдкреГрд╖реНрдареЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рджрд┐рдЦрд╛рдИ рджреА рд╣реИред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдкреГрд╖реНрда рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ ActionBar рд╢реБрд░реВ рдореЗрдВ рдЕрджреГрд╢реНрдп рд╣реИ рдФрд░ рдХрд▓рд╛рдХрд╛рд░ рдпрд╛ рдПрд▓реНрдмрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдмрдбрд╝реА рдЫрд╡рд┐ рдХреЛ рдУрд╡рд░рд▓реЗ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдЖрдк рдкреГрд╖реНрда рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ), рддреЛ ActionBar рдзреАрд░реЗ-рдзреАрд░реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред ActionBar рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реИ рдЬрдм рдЫрд╡рд┐ рд╕реНрдХреНрд░реАрди рдХреЗ рдкреАрдЫреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреА рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ ActionBar рдПрдиреАрдореЗрд╢рди рдХреЗ рджреЛ рдореБрдЦреНрдп рд▓рд╛рдн рд╣реИрдВ:

рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдкреНрд▓реЗ рдореНрдпреВрдЬрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП " рдПрдХреНрд╢рдирдмреЗрд░ рдЗрди рдореЛрд╢рди " рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рдХрд┐рди рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЫрд╡рд┐

рд╕реИрдВрдкрд▓ рдПрдкреАрдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдпреЛрдВ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдРрд╕реЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ActionBar рдХреЛ рд╕реНрдХреНрд░реАрди рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ android:windowActionBarOverlay XML рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЙрд╕ рд╡рд┐рд╖рдп рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
рдорд╛рди / рдереАрдоред xml
 <?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.TranslucentActionBar" parent="@android:style/Theme.Holo.Light.DarkActionBar"> <item name="android:actionBarStyle">@style/Widget.ActionBar</item> </style> <style name="Theme.TranslucentActionBar.ActionBar" /> <style name="Theme.TranslucentActionBar.ActionBar.Overlay"> <item name="android:actionBarStyle">@style/Widget.ActionBar.Transparent</item> <item name="android:windowActionBarOverlay">true</item> </style> </resources> 

рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ, ActionBar рд╢реИрд▓реА рдХреЛ рдореВрд▓реНрдпреЛрдВ / рд╢реИрд▓рд┐рдпреЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред xml рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рдорд╛рди / рд╕реНрдЯрд╛рдЗрд▓ред xml
 <?xml version="1.0" encoding="utf-8"?> <resources> <style name="Widget.ActionBar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse"> <item name="android:background">@drawable/ab_background</item> </style> <style name="Widget.ActionBar.Transparent"> <item name="android:background">@android:color/transparent</item> </style> </resources> 

рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдЗрд╕ рд╢реИрд▓реА рдХреЛ рдЕрдкрдиреА Activity рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
AndroidManifest.xml
 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cyrilmottier.android.translucentactionbar" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.TranslucentActionBar"> <activity android:name=".HomeActivity" android:theme="@style/Theme.TranslucentActionBar.ActionBar.Overlay"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд┐рд╖рдпреЛрдВ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдХреА рдорджрдж рд╕реЗ, рд╣рдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдлрд╝реНрд▓рд┐рдХрд░рд┐рдВрдЧ рдХреА рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рддреЗ рд╣реИрдВ (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП " рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди " рджреЗрдЦреЗрдВ)ред

рддреИрдпрд╛рд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛, рдПрдХ ActionBar рд╕реНрдХреНрд░реЙрд▓ рдХрдВрдЯреЗрдирд░ рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓-рдмрд╛рдп-рдкрд┐рдХреНрд╕реЗрд▓ рд╕реНрдерд┐рддрд┐ рдкрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рд╕реНрдХреНрд░реЙрд▓ рд╕реНрдХреНрд░реЙрд▓ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓ рдХрд╛ ScrollView рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдПрдХ рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд╕реНрдХреНрд░реЙрд▓ рд╢реНрд░реЛрддрд╛ рдХреЛ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЛрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рд╕реНрдХреНрд░реЙрд▓ рд░рд╛рдЬреНрдп рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореВрд▓ ScrollView NotifyingScrollView рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА NotifyingScrollView рдмрдирд╛рдХрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
NotifyingScrollView.java
 package com.cyrilmottier.android.translucentactionbar; import android.content.Context; import android.util.AttributeSet; import android.widget.ScrollView; /** * @author Cyril Mottier */ public class NotifyingScrollView extends ScrollView { /** * @author Cyril Mottier */ public interface OnScrollChangedListener { void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt); } private OnScrollChangedListener mOnScrollChangedListener; public NotifyingScrollView(Context context) { super(context); } public NotifyingScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public NotifyingScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (mOnScrollChangedListener != null) { mOnScrollChangedListener.onScrollChanged(this, l, t, oldl, oldt); } } public void setOnScrollChangedListener(OnScrollChangedListener listener) { mOnScrollChangedListener = listener; } } 

рдЕрдм рд╣рдо рдЕрдкрдиреЗ XML рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдЗрд╕ рдирдП рд╕реНрдХреНрд░реЙрд▓ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд▓реЗрдЖрдЙрдЯ / рдЧрддрд┐рд╡рд┐рдзрд┐_рд╣реЛрдоред xml
 <?xml version="1.0" encoding="utf-8"?> <com.cyrilmottier.android.translucentactionbar.NotifyingScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scroll_view" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:id="@+id/image_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" android:src="@drawable/daft_punk"/> <! -- Some long content --> </LinearLayout> </com.cyrilmottier.android.translucentactionbar.NotifyingScrollView> 


рджрд┐рдЦрд╛рдПрдБ \ Hide ActionBar


рдЕрдм рд╣рдорд╛рд░рд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреЗрдореНрдкрд▓реЗрдЯ рддреИрдпрд╛рд░ рд╣реИ, рдФрд░ рд╣рдо рдЗрди рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред ActionBar рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ NotifyingScrollView рд╕реНрдХреНрд░реЙрд▓ NotifyingScrollView рдХреА рдкрд┐рдХреНрд╕реЗрд▓ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХреА рдЧрдгрдирд╛ NotifyingScrollView ред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ [0, image_height - actionbar_height] рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓ рдХрдВрдЯреЗрдирд░ рдмрд╛рд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЧрд▓рдд рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рд╕реНрдХреНрд░реЙрд▓ рджреВрд░реА [0, image_height - actionbar_height] рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
HomeActivity.java
 package com.cyrilmottier.android.translucentactionbar; import android.app.Activity; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.view.Menu; import android.widget.ScrollView; public class HomeActivity extends Activity { private Drawable mActionBarBackgroundDrawable; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); mActionBarBackgroundDrawable = getResources().getDrawable(R.drawable.ab_background); mActionBarBackgroundDrawable.setAlpha(0); getActionBar().setBackgroundDrawable(mActionBarBackgroundDrawable); ((NotifyingScrollView) findViewById(R.id.scroll_view)).setOnScrollChangedListener(mOnScrollChangedListener); } private NotifyingScrollView.OnScrollChangedListener mOnScrollChangedListener = new NotifyingScrollView.OnScrollChangedListener() { public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) { final int headerHeight = findViewById(R.id.image_header).getHeight() - getActionBar().getHeight(); final float ratio = (float) Math.min(Math.max(t, 0), headerHeight) / headerHeight; final int newAlpha = (int) (ratio * 255); mActionBarBackgroundDrawable.setAlpha(newAlpha); } }; } 

рдЬреИрд╕рд╛ рдХрд┐ " ActionBar in motion " рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдпрд╣ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкреВрд░реНрд╡ JELLY_BEAN_MR1 рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ ActionBar рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдЦреБрдж рдХреЛ рдЕрдорд╛рдиреНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Drawable рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреБрдж рдХреЛ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдмрд╕ onCreate(Bundle) рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд Callback рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ:
HomeActivity.java
 private Drawable.Callback mDrawableCallback = new Drawable.Callback() { @Override public void invalidateDrawable(Drawable who) { getActionBar().setBackgroundDrawable(who); } @Override public void scheduleDrawable(Drawable who, Runnable what, long when) { } @Override public void unscheduleDrawable(Drawable who, Runnable what) { } }; 


HomeActivity.java
 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { mActionBarBackgroundDrawable.setCallback(mDrawableCallback); } 

рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдкрд░рд┐рдгрд╛рдо рдкреНрд▓реЗ рдореНрдпреВрдЬрд┐рдХ рдРрдк рдХреЗ рдПрдиреАрдореЗрд╢рди рдЬреИрд╕рд╛ рд╣реА рджрд┐рдЦрддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдирд┐рдЦрд╛рд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрддрд┐рдо рдмреНрд░рд╢ рд╕реНрдЯреНрд░реЛрдХ


ActionBar рдХрд╛ рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдмрдврд╝рд╛рдирд╛

рдкрд╛рд░рджрд░реНрд╢реА ActionBar рд╣реЛрдиреЗ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рдВрдмрдВрдзреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдЙрд╕ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рд╢реАрд░реНрд╖ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд░реНрдгрди рдореЗрдВ рд╕рдлреЗрдж рдХреИрдкреНрд╢рди рдФрд░ рд╕рдлреЗрдж рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдкрд╛рд░рджрд░реНрд╢реА ActionBar рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╣рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ ActionBar рдЕрджреГрд╢реНрдп рдФрд░ рдмреЗрдХрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдХреЛ рд╢реАрд░реНрд╖ рдкрд░ рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ (рдпрд╛рдиреА рдПрдХ рд╕рдлреЗрдж рдЫрд╡рд┐), ActionBar рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЧреНрд░реЗ рдХреНрд╖реЗрддреНрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА (рдирд╛рдо, рдЪрд┐рд╣реНрди, рдмрдЯрди, рдЖрджрд┐) рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред
рдЖрдк рдЫрд╡рд┐ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдЕрдВрдзреЗрд░реЗ рдкрд╛рд░рднрд╛рд╕реА рдврд╛рд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо Drawable XML рд╡рд┐рд╡рд░рдг рдореЗрдВ рдмрдирд╛рдПрдВрдЧреЗ:
drawable / gradient.xml
 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:height="100dp"/> <gradient android:angle="270" android:startColor="#8000" android:endColor="#0000"/> </shape> 

рд╣рдо FrameLayout рдорд╛рдзреНрдпрдо рд╕реЗ рдврд╛рд▓ рдУрд╡рд░рд▓реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
рд▓реЗрдЖрдЙрдЯ / рдЧрддрд┐рд╡рд┐рдзрд┐_рд╣реЛрдоред xml
 <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/image_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" android:src="@drawable/daft_punk"/> <View android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/gradient"/> </FrameLayout> 

рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ

рдЬрд┐рдВрдЬрд░рдмреНрд░реЗрдб (рдПрдкреАрдЖрдИ 9) рдореЗрдВ, рдПрдВрдбреНрд░реЙрдЗрдб рдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рддрд░реАрдХрд╛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдХрд┐ рд╕реНрдХреНрд░реЙрд▓ рдХрдВрдЯреЗрдирд░ рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред EdgeEffect рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдПрдкреАрдЖрдИ 14 рдореЗрдВ рдПрдХ рдПрдкреАрдЖрдИ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ), рдЬрд┐рд╕рдореЗрдВ рдУрд╡рд░-рд╕реНрдХреНрд░реЙрд▓ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рд╛рдордЧреНрд░реА рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ рд╕реЗ рдЕрд▓рдЧ рд╣реЛред
рдЖрдк рдмрд╕ рдЗрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ ScrollView рдЕрдк ScrollView рдХрд░рдХреЗ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕реНрдХреНрд░реАрди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдХреБрдЫ рд╕рдлреЗрдж (рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ) рдХреИрд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЫрд╡рд┐ рдЗрд╕рдХреЗ рдкрд░реЗ рд╕реНрдХреНрд░реЙрд▓ рдХреА рдЬрд╛рддреА рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рдорд╛рдирддрд╛ рд╣реВрдВ рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
рдУрд╡рд░-рд╕реНрдХреНрд░реЙрд▓ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ View#OVER_SCROLL_NEVER рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП View#setOverScrollMode(int) рдХрд╛ View#OVER_SCROLL_NEVER ред рдпрджреНрдпрдкрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ EdgeEffect рдХреЛ рднреА рд╣рдЯрд╛ EdgeEffect , рдЬреЛ рдиреЗрддреНрд░рд╣реАрди рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдУрд╡рд░-рд╕реНрдХреНрд░реЙрд▓ рдорд╛рди рдХреЛ рд╢реВрдиреНрдп рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП NotifyingScrollView рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
NotifyingScrollView.java
 private boolean mIsOverScrollEnabled = true; public void setOverScrollEnabled(boolean enabled) { mIsOverScrollEnabled = enabled; } public boolean isOverScrollEnabled() { return mIsOverScrollEnabled; } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { return super.overScrollBy( deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, mIsOverScrollEnabled ? maxOverScrollX : 0, mIsOverScrollEnabled ? maxOverScrollY : 0, isTouchEvent); } 


рдирд┐рд╖реНрдХрд░реНрд╖


рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ Play Music рдРрдк рдЯреАрдо рдиреЗ рдореЗрд░реЗ рд▓реЗрдЦ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ рд╢рд╛рдирджрд╛рд░ рдврдВрдЧ рд╕реЗ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЪрдордХрд╛рдиреЗ рдФрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдврд╝рд┐рдпрд╛ рдкреИрдЯрд░реНрди рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдПрдХ рд╕реНрдХреНрд░реАрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ рдПрдХреНрд╢рдирдмрд╛рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

Source: https://habr.com/ru/post/In190102/


All Articles